2016-05-19 3 views
1

以下のコードを実行すると、セグメンテーションフォルトが発生します。これは、回線を削除すると消えます。int i, *ptr[3];なぜこのようなことが起こっているのか理解できません。これは、すでに問題を招いているなぜ "int i、* ptr [3];"私のコードにセグメンテーションフォルトを生成する?

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

enum otype {INT, SYM, CONS}; 
typedef struct obj { 
    enum otype type; 
    struct obj *p[1]; 
} obj; 

int main(void) 
{ 
    char *str; 
    strcpy(str, "test"); 
    printf("%c\n", str[0]); 

    struct obj obj1; 
    obj1.type = INT; 
    obj1.p[0] = (obj*) malloc(sizeof(obj)); 
    obj1.p[0]->type = SYM; 
    printf("%d\n", (obj1.p[0])->type); 
    free(obj1.p[0]); 

    int i, *ptr[3]; 

    return 0; 
} 
+1

最初のUBは 'strcpy(str、" test ");' 'str'に割り当てられるスペースがありません – yano

+0

あなたの 'str'はポインタですが、メモリは割り当てられていません。次に、 'strcpy'は文字列' 'test"を '' str'が指すところにコピーします。 – Jens

答えて

2
char *str; 
strcpy(str, "test"); 

、あらゆる行動はその後、予測不可能です。

もっと正確には、undefined behaviorをトリガーしました。ランダムな場所に「テスト」を書き込むようにしました。場所はstrとなりますが、有効なメモリを指すようにstrを初期化したことはありません。

あなたは

char str[100]; 
strcpy(str, "test"); 

を行っている可能性があり、罰金になります。もちろん、この方法では、文字列の長さに上限の長さを置いています。ヌルターミネータの場合、99文字+ 1です。

+0

IMHO、 'strdup()'について話をするのはすばらしいことです。 – nouney

+0

@nouney strdupもフリーズするので、私は彼に他のアプローチを示します –

+0

ありがとうございました! strcpy(str、 "test")を削除しました。問題は解決されました。私には、このエラーは本当に不思議です。 – james0011

0

あなたは のchar * strの にコピーする前に、 "STR" のためにメモリを割り当てる必要がある - [4]> 文字列str; またはmallocを使用してください。

1

問題はここにある:

char *str; 
strcpy(str, "test"); 

あなたはそれを初期化せずにポインタを宣言します。次に、それをstrcpyに渡します。これは、指定された文字列を逆参照してコピーを試みます。 strは未知の場所を指しているので、逆参照するとUndefined Behaviorになります。つまり、一見無関係な変更を加えると、プログラムがクラッシュする(クラッシュしない)ことがあります。

代わりのポインタとしてstrを宣言し、それが知られているサイズと小文字ように、文字配列として宣言:

char str[50]; 
strcpy(str, "test"); 

それとも単にそれが宣言されたときに、それを初期化:

char str[] = "test"; 

しますか、 :

char *str = "test"; 
+0

ありがとうございます!私は今問題を理解している。それは本当に問題を解決しました。 – james0011

関連する問題