2016-12-19 7 views
1

私は以下のように簡単なプログラムを書いています。メモリアクセス違反がcでエラーを起こさない

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

int main() 
{ 
    char *a=NULL; 
    int i; 
    a = malloc(sizeof(char) *10); 
    memset(a,100,'\0'); 

    if(a == NULL) printf("errr\n"); 
    for(i=0;i<20;i++) 
     a[i]='c'; 

    printf("%s",a); 
    printf("%d",strlen(a)); 
} 

ここでは、10バイトしか割り当てずに20バイトを割り当てました。私はコードを正常にコンパイルし、セグメンテーションフォールトなしで実行します。

私の質問はなぜここにセグメンテーションフォールトを与えませんか?

+2

これはあなたにsegフォルトを与える必要はありません。それは単純に[未定義の動作](http://en.cppreference.com/w/cpp/language/ub)です。 '作業'。 – George

答えて

2

問題は、許可されていない(無効な)メモリアクセスがundefined behaviorを呼び出すことです。結果は未定義です。

は、セグメンテーションフォールトがUBの多く可能な結果、UBを呼び出していないだけ one.Fromコードの一つであり、あなたが特定のではなく、さらにセグメンテーションフォールトのために何を期待することはできません、覚えておいてください。

しかし、コンパイルが成功するためには、コンパイラがコンパイルを拒否する構文エラーがないので、コンパイルは成功です。

それとは別に、いくつかの観測点/提案

  • memset(a,100,'\0');が間違っているように見える、何をしたいかもしれないことはmemset(a,'\0', 100);ですが、あなたはとにかく割り当てられたサイズを超過することがありますように、そのも、間違っていることでしょう。
  • ホスト環境の場合、main()の署名は、少なくとも標準に準拠していると、int main(void)です。
  • 返されたポインタを使用する前に、常にmalloc()の成功を確認してください。
関連する問題