动态内存分配与指针问题求助:数组越界警告及分配纠错
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调用行。
错误分析
数组越界核心问题
结构体中name定义为char *name[3][1],这是一个3行1列的二维指针数组。C语言数组索引从0开始,第二维的有效索引只有0,但代码中却使用admin.name[i][1]访问第二维的第2个元素(索引1),直接超出数组边界,触发越界警告。其他隐性问题
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
相关产品推荐
相关产品推荐

