C中的内存地址

时间:2013-02-12 16:57:10

标签: c c-strings dynamic-allocation

在主要功能的最后一行,为什么&word2word2不同?假设正确的标题已到位。谢谢!

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 个答案:

答案 0 :(得分:7)

word2是您使用malloc分配的内存地址。

&word2是名为word2

的变量的地址

答案 1 :(得分:2)

第一个是word2指针堆栈上的地址 - 存储值的双指针。

第二个是存储在word2中的实际地址 - 我将从malloc中假定的堆上的某个地方。

答案 2 :(得分:2)

当您声明char word1[20];创建一个包含20个字符的数组时。这里,word1是其第一个元素的地址,但不是数组的地址。

& word1表示数组的地址。 word1&word1的值实际上是相同的,但在语义上两者都不同。一个是char的地址,而另一个是20个字符的数组的地址。 you should read this answer

第二种情况:

当您声明char *word2;时,您创建了一个指针变量。它可以指向一个char或者可以像你一样存储动态分配的数组的地址。

因此word2的值表示malloc()的地址返回。在下面的行。

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

但表达式&word2表示指针变量的地址。 malloc的地址返回与指针名称word2的地址不同。

word2word1类型不同。

另请阅读Nate Chandler's answer

word1word2之间的根本区别:

在下图中。

diagram

word1a相同(不是按大小而是按类型)。和word2就像p

此处p的值表示"world"字符串的地址,&p表示p变量的地址。

答案 3 :(得分:0)

在第一个语句中&word1指的是数组的地址。由于此数组在堆栈&word1上静态分配,因此与word1相同,与&word1[0]相同。

在第二种情况下,word2是堆栈上的指针,其地址显示在打印的第一部分,word2包含通过malloc分配的指针。