2011-07-04 12 views
4
#include<string.h> 
#include<stdio.h> 

int main() 
{   
    char *p;   
    strcpy(p,"hello world"); 
} 

まあ、undefined behaviourと表示されていますか?こんにちは世界を指していますか?私はこの種のsytaxを使用しているプログラマーの多くを見てきました。文字列のサイズを知っていない配列よりも優れています。しかし、プログラミングで使用するのが良いです。文字列とポインタ

+0

私はこれを実行しようとしたときにsegfaultを取得しました。それは実行時にコンパイルされ、失敗しました。私は初期化されていないポインタから期待しています。 – ncmathsadist

答えて

4

これは未定義の動作で、pは未初期化です。私はあなたが実際に多くの人がそれをしているのを見ているとは思いません...

strcopyは、第2引数の内容をコピーするのに十分な長さのバッファが必要です。あなたの例は故意に考案されていますが、実際のコードではバッファを割り当てるためにsource_stringのサイズを知る必要があります。

+0

ダイナミックアロケーションはどうですか? – cody

+0

ねえ、あなたはどのように配列の動的メモリ割り当てを与える知っている? – cody

+0

ええ、必要に応じて動的にバッファを割り当てることはできますが、それはレスポンスを変更しません。文字列「hello world」を保持するために、スタックに 'char [12]'を完全に割り当てることができます。 –

0

pが初期化されていないため、何かをコピーするとSegmentation Faultが生成され、pが指しているメモリ内の場所がコードで指定されていないため、予期しない結果になります。

pに文字列をコピーする前に、pが指しているメモリを指定する必要があります。

あなたは行動を明示的に定義されていませんので、あなたは、pを初期化できませんでしたchar [12];

+1

または 'char [12]' =) –

2

例えばchar [Buffersize];
を使用する必要があります。 pを初期化して、文字列を保持するのに十分な領域を指すようにするか、"hello world"pに割り当てない(リテラル文字列が格納されている初期化されたプログラムメモリの領域を指す)か、strdup()strcpy()の代わりに、それは動作します。

+0

私に新しいstrdup関数を紹介してくれてありがとう。 – cody

1

私はプログラマーの多くがこれらの種類の構文を使用しているのを見てきました。

私はそれを疑います。たぶん、その構文の一部ではあるが、これらのセマンティクスではなく、すなわち、文字列を保持するのに十分な大きさのメモリ領域を指す 'p'がない場合、その末尾のヌルバイトを含む。

1

投稿したコードが間違っていて、プログラムがクラッシュする可能性があります。そのようなコードが頻繁に表示されることは想像もつきません。

次のようなコードが表示される可能性が高くなります。

int main() 
{ 
    char *p = (char*)malloc(20); 
    strcpy(p, "hello world"); 
    free(p); 
} 
+0

はい、あなたの右のジョナサン – cody

1

文字列を取得するために割り当ておよびコピーする必要はありません。コンパイラにあなたのためにすべての作業をさせることができます:

char p[] = "Hello world!"; 

さらに、配列の適切なサイズを計算します。

関連する問題