这个问题在这里已经有了答案:
String literals: pointer vs. char array
(1 个回答)
4 个月前关闭。
当我执行下一个代码时
int main()
{
char tmp[] = "hello";
printf("%lp, %lp\n", tmp, &tmp);
return 0;
}
我得到了相同的地址。但是对于下一个代码,它们会有所不同int main()
{
char *tmp = "hello";
printf("%lp, %lp\n", tmp, &tmp);
return 0;
}
你能解释一下这些例子之间的内存差异吗?
最佳答案
char tmp[] = "hello";
是一个由 6 个字符组成的数组,初始化为 "hello\0"
(它具有自动存储持续时间并驻留在程序堆栈中)。char *tmp = "hello";
是指向 char
的指针用字符串文字的地址初始化 "hello\0"
驻留在只读内存中(通常在可执行文件的 .rodata
部分中,除了少数实现之外的所有实现都是只读的)。
当您有 char tmp[] = "hello";
,如上所述,在访问时,数组被转换为指向 tmp
的第一个元素的指针。 .它有类型 char *
.当你取地址tmp
(例如 &tmp
)它将解析为相同的地址,但具有完全不同的类型。它将是一个指向数组的指针 char[6]
.正式类型是char (*)[6]
.从 类型控制指针运算 ,当您前进指针时,使用不同类型进行迭代将产生不同的偏移量。前进 tmp
将前进到下一个char
.推进地址tmp
将前进到下一个 6 字符数组的开头。
当您有 char *tmp = "hello";
你有一个指向 char
的指针.当你取地址时,结果是指向指针的指针char
.正式类型是char **
反射(reflect)了两个间接层次。前进 tmp
前进到下一个 char
.推进地址tmp
前进到下一个指针。
关于arrays - char *array 和 char array[] 之间的内存区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67865746/