2


0

strcpy使用時のセグメンテーション違反?

コンパイル時にパスを定義しようとしています:

-DDCROOTDEF='"/path/to/stuff"'

コンパイル行。 次に、次のようなコードでこれを使用しようとします:

char * ptr_path;
strcpy(ptr_path, DCROOTDEF);
strcat(ptr_path,"/MainCommons/CommonLib/fonts/Arial.ttf");
char *pftf=ptr_path;
gdImageStringFT(pimg,brect,iclr,pftf,pts,ang,ixp,iyp, (char *)cbuf);

セグメンテーション違反が発生します。 ただし、文字列を最初に印刷しようとすると:

char * ptr_path;
strcpy(ptr_path, DCROOTDEF);
strcat(ptr_path,"/MainCommons/CommonLib/fonts/Arial.ttf");
char *pftf=ptr_path;
printf("%s\n",pftf);
gdImageStringFT(pimg,brect,iclr,pftf,pts,ang,ixp,iyp, (char *)cbuf);

それはちょうどうまくいきます。 ここでは、charポインターのどのような複雑さが欠けていますか?

ありがとう

3 Answer


3


char * ptr_path;
strcpy(ptr_path, DCROOTDEF);

`ptr_path`を初期化することはありません。

2番目のコードスニペットでは機能しません。あなたは不運になり、動作するように見えます。 あなたはまだ初期化されていないポインタを使用しており、誰がメモリのどこにいるかを知っている人に書き込もうとしています。

少なくとも strlen(DCROOTDEF)+ 1`の長さの char`の配列を指すように ptr_path`を初期化する必要があります。 また、内容を配列にコピーする前に「DCROOTDEF」の長さを確認して、長すぎないことを確認する必要があります。 `strlen`を使用して手動で行うか、 strlcpy`のような長さチェックされたコピー関数を使用できます。


1


ポインター ptr_path`は書き込み可能なメモリを指すように初期化されていません。そのため、 strcpy() `を使用してポインターを逆参照するとクラッシュします。

を呼び出す必要があります 最初にスペースを取得するための malloc()

char * ptr_path = malloc(PATH_MAX);

それとも何か。


1


In

char * ptr_path;
strcpy(ptr_path, DCROOTDEF);
strcat(ptr_path,"/MainCommons/CommonLib/fonts/Arial.ttf");

ポインターは法的に割り当てられたメモリブロックにバインドされていないため、プログラムは未定義の動作に陥ります。 最初にバッファを割り当てる必要があります-たとえば、 `malloc()`を使用します。 バッファが、結果の文字列と終端のヌル文字を保持するのに十分な大きさであることを確認してください。