字符串以数组形式传递时的内存分配问题
字符串字面量传入char数组参数的内存分配详解
咱们先澄清C语言里一个容易被误解的细节:函数参数中的char a[]本质上等价于char* a——编译器会直接把它当作指针来处理,并不会在函数内部为数组分配新的内存空间。搞懂这个,后面的问题就清晰多了。
1. a[]的内存分配与存储位置
当你调用someFunc("Frankenstein is dead")这类代码时:
- 首先,字符串字面量
"Frankenstein is dead"会在程序启动阶段就被分配到只读数据段(通常标记为.rodata)。这部分属于程序的静态内存区域,特点是只读——如果尝试修改这里的内容,会触发未定义行为(比如程序崩溃)。 - 函数里的
a是一个局部指针变量,它会被分配在栈内存上。这个指针的作用只是指向只读数据段中那个字符串字面量的起始地址,并没有为字符串本身分配新的内存。简单说,a只是“指向”了已经存在的字符串,而非“拥有”它。
2. 不同长度字符串的内存大小如何确定
字符串字面量的内存大小是编译器在编译阶段就自动计算好的:
- 每个字符串的总大小等于「可见字符的数量 + 1」,多出来的1字节是C语言字符串必须的
'\0'终止符。比如"Hello there"有11个可见字符,加上终止符,总占用12字节的内存。 - 编译器会逐个处理代码中的每个字符串字面量,自动计算其长度,然后在只读数据段中为它分配对应大小的空间,完全不需要你手动指定或计算。
最后补个重要提醒:因为字符串字面量存在只读段,千万不要尝试通过a去修改它的内容(比如写a[0] = 'F'这种代码),这属于未定义行为,程序可能出现各种奇怪的问题,甚至直接崩溃。
内容的提问来源于stack exchange,提问作者Akshay Bhat
相关产品推荐
相关产品推荐

