3

main関数の最後の行で、なぜとは&word2違うのword2ですか?正しいヘッダーが配置されていると仮定します。ありがとうございました!

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

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

    printf("Sizeof word 1: %d\n", sizeof (word1));
    printf("Sizeof word 2: %d\n", sizeof (word2));

    strcpy(word1, "string number 1");
    strcpy(word2, "string number 2");

    printf("%s\n", word1);
    printf("%s\n", word2);
    printf("Address %d, evaluated expression: %d\n", &word1, word1);
    printf("Address %d, evaluated expression: %d\n", &word2, word2); 
    //Why this one differ?
}
4

4 に答える 4

7

word2を使用して割り当てたメモリのアドレスですmalloc

&word2は、という名前の変数のアドレスですword2

于 2013-02-12T16:59:53.783 に答える
2

1つ目は、ポインタのスタック上のアドレスword2です。値が格納されているダブルポインタです。

word22つ目は、mallocから推測するヒープのどこかに格納されている実際のアドレスです。

于 2013-02-12T17:00:07.460 に答える
2

宣言char word1[20]; すると、20文字の配列が作成されます。ここでword1は、最初の要素のアドレスですが、配列のアドレスではありません。

& word1配列のアドレスを意味します。word1との値 &word1は実際には同じですが、意味的には両方が異なります。1つは文字のアドレスであり、もう1つは20文字の配列のアドレスです。あなたはこの答えを読むべきです。

2番目のケース:

宣言する char *word2;と、ポインタ変数が作成されます。charを指すことも、動的に割り当てられた配列のアドレスを格納することもできます。

したがって、の値は。word2によるアドレスリターンを意味しますmalloc()。下の行に。

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

ただし、式&word2はポインタ変数のアドレスを意味します。また、mallocによるアドレスの戻りは、ポインターのアドレスとは異なりますword2

word2word1タイプ と同じではありません。

ネイトチャンドラーの答えも読んでください

word1 との根本的な違いword2

下の図では。

ダイアグラム

word1と同じですaサイズではなくタイプ)。のword2ようなものですp

ここでの値は文字列のpアドレスを意味し、変数のアドレスを意味します。"world"&pp

于 2013-02-12T17:08:40.870 に答える
0

最初のステートメント&word1では、配列のアドレスを参照しています。この配列はスタックに静的に割り当てられるため、と同じ&word1です。word1&word1[0]

2番目のケースword2は、アドレスが印刷の最初の部分に示され、word2を介して割り当てられたポインターを含むスタック上のポインターmallocです。

于 2013-02-12T17:08:37.963 に答える