在主要功能的最后一行,为什么&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?
}
答案 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
的地址不同。
word2
与word1
类型不同。
word1
和word2
之间的根本区别:
在下图中。
word1
与a
相同(不是按大小而是按类型)。和word2
就像p
此处p
的值表示"world"
字符串的地址,&p
表示p
变量的地址。
答案 3 :(得分:0)
在第一个语句中&word1
指的是数组的地址。由于此数组在堆栈&word1
上静态分配,因此与word1
相同,与&word1[0]
相同。
在第二种情况下,word2
是堆栈上的指针,其地址显示在打印的第一部分,word2
包含通过malloc
分配的指针。