我有以下代码示例:
#include <stdio.h>
int main(void)
{
char *text[2];
text[0] = "Hello";
text[1] = "World";
printf("Address of text[0]: %p\n", text[0]);
printf("Address of text : %p\n", text);
return 0;
}
该程序的输出是:
Address of text[0]: 0x400694
Address of text : 0x7ffcac41b000
我想知道为什么这些地址的长度不同。为什么第一个指向char的地址只有6位数?
答案 0 :(得分:3)
&#34;地址长度&#34;没有区别,区别在于值。
在这种特殊情况下,我假设text[0]
指针指向一个保存编译时间值"Hello"
的数据段,text
指针指向运行时地址。
由于它们位于不同的内存段,因此它们可以“非常远”。所以你得到你看到的输出。
答案 1 :(得分:2)
第一个地址是&#34; Hello&#34;的地址,存储在您的数据段中。
第二个地址是text[]
的地址,存储在您的堆栈中。
这两个记忆区域彼此相距很远,所以一个有很多位数,另一个有几个数字。
显然,%p
只能呈现代表地址所需的数字。
答案 2 :(得分:0)
printf("Address of text[0]: %p\n", text[0]);
打印C字符串的地址(数组指向的地址第一个元素),而:
printf("Address of text : %p\n", text);
打印数组第一个元素的地址。
答案 3 :(得分:0)
要获取数组text
的第一项的地址,您必须使用:
printf("Address of text[0]: %p\n", (void *)&text[0]);
在您的问题中,您正在打印字符串"Hello"
的第一个字符的地址(换句话说,是文本[0]的内容),而不是地址数组text
的第一个元素,即 text[0]
的地址,只是存储 的地址 text[0]
。