为何使用“=”时无段错误?C语言内存分配机制疑问
问题解答
先明确核心概念:char *store[8]到底是什么
这是一个包含8个char类型指针的数组:
- 数组本身(store这个整体)在栈上分配了内存,用来存放8个指针地址;
- 但数组里的每个指针(比如store[0])默认是未初始化的,它的初始值是随机的,指向的是一块不确定的、大概率无效的内存空间。
两种操作的本质差异
1. store[0] = string;
这一步只是给指针变量store[0]赋值:把string数组的首地址(&string[0])存到store[0]里。
- 此时store[0]指向的是
string已经分配好的栈内存(char string[7]是实实在在的字符数组,有可读写的存储空间); - 用
%s打印时,从这个有效地址开始读取字符串,自然能输出正确内容。
2. strcpy(store[0], string)
strcpy的工作逻辑是:把第二个参数的字符串内容,逐字节复制到第一个参数指向的内存空间。但这里的问题是:
- 执行这行代码时,store[0]是未初始化的随机值,它指向的内存要么是不属于当前程序的,要么是只读的,根本没有权限写入;
- 强行写入就会触发段错误,也就是系统阻止你访问未授权内存。
解答你的疑问
第一种方式中,store[0]不是已分配预留内存了吗?
你混淆了「指针变量自身的内存」和「指针指向的内存」:- store[0]作为数组元素,它自己的内存是分配了的(用来存地址值);
- 但它指向的内存并没有被分配有效空间——第一种操作只是让它「挂靠」到了string已有的内存上,不是给它新分配了内存。
两种操作的内存处理有何差异?
store[0] = string;:没有复制任何字符串内容,只是让两个指针指向同一块内存;strcpy(store[0], string):需要目标指针指向一块足够大的可写内存,用来存放复制后的字符串——但你没给store[0]分配这块内存,所以出错。
既然定义了
char *store[8],store[0]在两种场景下不都已存在吗?
store[0]这个指针变量本身确实都存在,但它的指向状态完全不同:- 第一种操作后,它指向了有效的、可读写的string内存;
- 第二种操作前,它是随机值,指向的是无效内存。
内容的提问来源于stack exchange,提问作者minorproblem
相关产品推荐
相关产品推荐

