gpt4 book ai didi

arrays - char *array 和 char array[] 之间的内存区别是什么?

转载 作者:行者123 更新时间:2023-12-03 20:21:00 30 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com