web-dev-qa-db-ja.com

strcpyによるセグメンテーション違反

以下のコードでセグメンテーション違反が発生するのはなぜですか?.

int main(void)
{
        char str[100]="My name is Vutukuri";
        char *str_old,*str_new;

        str_old=str;
        strcpy(str_new,str_old);

        puts(str_new);

        return 0;
}
13
Teja

初期化していません*str_newなので、単にコピーしていますstr_oldをランダムなアドレスに。次のいずれかを行う必要があります。

char str_new[100];

または

char * str = (char *) malloc(100);

あなたはしなければならない #include <stdlib.h> malloc関数を使用するときに、まだ使用していない場合。

28
seanwatson

str_newは初期化されていないポインタなので、(準)ランダムアドレスに書き込もうとしています。

7
geekosaur

_str_new_は有効なメモリを指さないため-初期化されておらず、ガベージが含まれており、セグメンテーションエラーが発生した場合はマップされていないメモリを指す可能性があります。 strcpy()を呼び出す前に、_str_new_が、対象の文字列を保持するのに十分な大きさの有効なメモリブロックを指すようにする必要があります(末尾に_\0_バイトを含む)。