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

使用双指针动态分配初始化二维数组时出现段错误求助

段错误原因分析与修复方案

核心问题

你创建二维指针数组时,指针数组的内存分配大小计算错误。

int **ptr是指向指针数组的指针,它需要存储5个int*类型的指针。但你用了malloc(sizeof(int)*5),多数系统中int占4字节,int*占8字节(64位环境),这就导致你只分配了20字节的内存,远不足以容纳5个指针。

前几次循环(i=0到3)时,写入的指针刚好挤在分配的内存范围内,不会触发错误;但当i=4时,写入位置超出了malloc分配的内存边界,触发了段错误。

修复后的代码

把指针数组的分配大小改成sizeof(int*),或者更健壮的sizeof(*ptr)(自动匹配指针类型),同时建议增加内存分配失败的检查和内存释放逻辑:

#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char *argv[]){
    int **ptr = (int **)malloc(sizeof(*ptr)*5);
    if (ptr == NULL) {
        perror("malloc failed for pointer array");
        return 1;
    }
    
    for(int i = 0; i<5; i++){
        ptr[i] = (int *)malloc(sizeof(int)*2);
        if (ptr[i] == NULL) {
            perror("malloc failed for row");
            // 释放已分配的内存避免泄漏
            for (int k = 0; k < i; k++) {
                free(ptr[k]);
            }
            free(ptr);
            return 1;
        }
    }
    
    for(int i = 0; i<5; i++){
        for(int j = 0; j<2; j++){
            ptr[i][j] = i;
        }
    }
    
    // 释放动态分配的内存
    for(int i = 0; i<5; i++){
        free(ptr[i]);
    }
    free(ptr);
    return 0;
} 

额外提示

  • 每次malloc后必须检查返回值是否为NULL,防止空指针操作导致程序崩溃。
  • 使用sizeof(*ptr)代替具体类型的sizeof,代码更易维护,类型变更时无需手动修改。
  • 动态分配的内存一定要记得释放,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 09:13:28