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

动态内存分配与指针问题求助:数组越界警告及分配纠错

C语言指针与动态内存分配错误排查

问题概述

在指针及动态内存分配的实现中存在困惑,需确认当前内存分配是否正确;同时使用fgets和puts时收到数组越界警告,怀疑与错误内存分配有关。

警告信息

  • array index 1 is past the end of the array (which contains 1 element) [-Warray-bounds]
  • array index 1 is past the end of the array (which contains 1 element) [-Warray-bounds]
  • array index 1 is past the end of the array (which contains 1 element) [-Warray-bounds]

上述警告分别对应内存分配行、fgets调用行和puts调用行。

错误分析

  1. 数组越界核心问题
    结构体中name定义为char *name[3][1],这是一个3行1列的二维指针数组。C语言数组索引从0开始,第二维的有效索引只有0,但代码中却使用admin.name[i][1]访问第二维的第2个元素(索引1),直接超出数组边界,触发越界警告。

  2. 其他隐性问题

    • main函数中循环变量i未声明,不符合C语言语法规范;
    • 未释放动态分配的内存,存在内存泄漏风险。

修正后的代码

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

const int n = 30, m = 30;

struct employer { 
    char *name[3][1];
    char *pass[n][m];
    int *ID;
};

int main() {
    struct employer admin;
    int i; // 声明循环变量
    
    for (i = 0; i < 3; i++) {
        // 使用正确的索引0分配内存,同时检查分配是否成功
        admin.name[i][0] = (char*)calloc(n, sizeof(char)); 
        if (admin.name[i][0] == NULL) {
            perror("calloc failed");
            return 1;
        }
    }
 
    for (i = 0; i < 3; i++) {
        fgets(admin.name[i][0], n, stdin);
        // 可选:去除fgets读取的换行符
        admin.name[i][0][strcspn(admin.name[i][0], "\n")] = '\0';
        puts(admin.name[i][0]);
    }

    // 释放动态内存,避免泄漏
    for (i = 0; i < 3; i++) {
        free(admin.name[i][0]);
        admin.name[i][0] = NULL; // 置空防止野指针
    }
 
    return 0;
}

简化实现建议

如果实际需求是存储3个名字,可将name简化为一维指针数组,逻辑更清晰:

struct employer { 
    char *name[3]; // 一维数组存储3个名字的指针
    char *pass[n][m];
    int *ID;
};

对应内存分配和使用部分改为admin.name[i] = (char*)calloc(n, sizeof(char));、fgets(admin.name[i], n, stdin);即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 03:53:10