You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

macOS下char数组与字符指针的内存地址为何差异巨大?

字符数组与字符指针的内存区域差异

我在复习C语言时,通过打印字符数组与字符指针的地址来学习内存布局,编写了如下代码:

int main() {
    char stringa[] = "";
    char *stringp = "";
    char *stringp2 = "a";


    printf ("%p\n", stringa);
    printf ("%p\n", stringp);
    printf ("%p\n", stringp2);
    return 0;
}

运行后输出:

0x7ff7b07ca1fb
0x10f738fa4
0x10f738fa5

从输出能明显看到字符数组与指针的地址落在内存的不同区域,原因如下:

  • char stringa[] = "" 是在栈内存上分配的字符数组,它的存储空间属于main函数的栈帧,这类地址通常属于栈地址范围(不同系统开头标识可能有差异)。
  • char *stringp = "" 和 char *stringp2 = "a" 中的""、"a"是字符串字面量,编译器会将它们存放在程序的只读数据段(.rodata),字符指针存储的是这些字面量在只读段的起始地址,这类地址与栈地址有明显区分。

额外补充:栈上的字符数组是可写的,而只读数据段的字符串字面量不可修改,强行修改会触发未定义行为。

内容的提问来源于stack exchange,提问作者StevieD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 00:15:59