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

为何使用“=”时无段错误?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]是未初始化的随机值,它指向的内存要么是不属于当前程序的,要么是只读的,根本没有权限写入;
  • 强行写入就会触发段错误,也就是系统阻止你访问未授权内存。

解答你的疑问

  1. 第一种方式中,store[0]不是已分配预留内存了吗?
    你混淆了「指针变量自身的内存」和「指针指向的内存」:

    • store[0]作为数组元素,它自己的内存是分配了的(用来存地址值);
    • 但它指向的内存并没有被分配有效空间——第一种操作只是让它「挂靠」到了string已有的内存上,不是给它新分配了内存。
  2. 两种操作的内存处理有何差异?

    • store[0] = string;:没有复制任何字符串内容,只是让两个指针指向同一块内存;
    • strcpy(store[0], string):需要目标指针指向一块足够大的可写内存,用来存放复制后的字符串——但你没给store[0]分配这块内存,所以出错。
  3. 既然定义了char *store[8],store[0]在两种场景下不都已存在吗?
    store[0]这个指针变量本身确实都存在,但它的指向状态完全不同:

    • 第一种操作后,它指向了有效的、可读写的string内存;
    • 第二种操作前,它是随机值,指向的是无效内存。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 08:47:17