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

标签 arrays c pointers memory

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





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/

相关文章:

c 创建一个程序,计算句子中有多少个单词,并将句子中的所有字母大写。

python - Julia:用数组中的字符串替换数字

ios - Backendless + Realm - 存储数组

c - ASM to C - 有人能解释一下这是什么结构吗?

c - pthread 库 undefined reference

c++ - 具有资源管理器的智能指针,让对象 "borrow"资源

c++ - sizeof(T) 可以产生的最大值是多少?

c++ - 无法在 C++ 中删除 char 指针

python - 混合类型的 NumPy 数组/矩阵

javascript - 沿对 Angular 线查找数组中的相同值