0

私は、このプログラムが十分なメモリを割り当てていないことを理解しています。

私が助けを必要としているのは、このコードが実行されたときに何が起こるかについての説明を説明することです。

「4つのスペースしか割り当てられていないため、十分なスペースが与えられていないため、エラーが発生します」と付けました。それは私には正しく聞こえません。ありがとう。

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

int main()
{ 
    char word1[20];
    char *word2;

    word2 = (char*)malloc(sizeof(char)*20);

    printf("Sizeof word 1: %d\n", sizeof (word1));  //This line outputs 20
    printf("Sizeof word 2: %d\n", sizeof (word2));  //This line outputs 4
                                                    //before & after I used malloc
    strcpy(word1, "string number 1");
    strcpy(word2, "string number 2"); <---- What is this doing

    printf("%s\n", word1);
    printf("%s\n", word2);
}
4

3 に答える 3

4

word2 は初期化されていないポインターです。それにデータを書き込むと、未定義の結果が生じますが、おそらくクラッシュします。word1を使用して、スタック ( の場合) または動的にメモリを割り当てる必要がありますmalloc

char *word2 = malloc(20); // arbitrary value. could use strlen(some_str)+1 also
strcpy(word2, "string number 2"); // works now

または、posix システムの場合

char *word2 = strdup("string number 2");

どちらの場合も、後で呼び出しfreeて、このメモリをシステムに返すようにしてください。

メモリを割り当てた後でも、sizeof(word2)4 のままであることword2に注意してください。char*sizeofchar*

于 2013-02-12T16:23:12.493 に答える
2

sizeof( word2 ) は 4 を返します。これはポインターのサイズだからです。

char *word2;

はポインタであり、それに0バイトが割り当てられています(あなたが言及したように4ではありません)

sizeof( word1 ) は、配列のサイズである 20 を返します。

char word1[20]

は配列で、20 バイトが予約されています

于 2013-02-12T16:24:14.647 に答える
0

プログラムword2には、以前の値またはおそらくジャンク値が含まれます。を実行するstrcpy(word2, "string number 2");と、アクセスできない場所に書き込もうとしているため、プログラムがクラッシュします。したがって、プログラムが書き込める十分なメモリを割り当てる必要があります。

于 2013-02-12T16:28:14.613 に答える