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

为什么这段C语言代码会产生段错误?

段错误原因分析

你的代码如下:

#include <stdio.h>
int main()
{
    int i,a;
    int* p;
    p=&a;
    for(i=0;i<=10;i++)
    {
        *(p+i)=i;
        printf("%d\n",*(p+i));
    }
    return 0;
}

错误原因

  • 你只定义了单个int变量a,指针p指向的是a的内存地址,这只是单个int大小的合法内存空间。
  • 循环中当i≥1时,*(p+i)会访问a之后的连续内存区域,但这部分内存根本没被你的程序申请分配,属于非法内存越界访问。
  • 操作系统会严格管控内存权限,当程序试图读写不属于自己的内存时,就会触发段错误(Segmentation Fault)来终止程序,防止非法操作破坏系统或其他程序的内存。

正确实现方式

如果想不用数组存连续的11个int数据,应该用动态内存分配从堆上申请连续空间:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i;
    // 分配能存储11个int的连续内存块
    int* p = malloc(11 * sizeof(int));
    // 必须检查内存分配是否成功
    if (p == NULL) {
        printf("内存分配失败\n");
        return 1;
    }
    
    for(i=0;i<=10;i++)
    {
        *(p+i)=i;
        printf("%d\n",*(p+i));
    }
    
    free(p); // 用完记得释放动态分配的内存,避免内存泄漏
    return 0;
}

内容的提问来源于stack exchange,提问作者Palarax dope palarax

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 14:32:21