C语言中创建二维数组时子数组被重复覆盖的问题求助
问题根源
你代码里的int line[sizeof(int) * squareSize];是栈帧上的局部变量,在for循环的每次迭代中,这个数组会被分配在同一个栈内存位置。当你把line的地址赋值给matrix[i]时,所有元素其实都指向同一块栈内存。循环结束后,这块内存最后一次被写入的内容(也就是最后一组数字7、8、9)会覆盖之前的所有数据,所以最终matrix的所有元素都显示最后一组的值。
另外你还犯了一个隐蔽的错误:int *matrix[sizeof(int) * squareSize];的数组长度定义错误——matrix是存储int*的数组,只需要squareSize个元素,而非sizeof(int)*squareSize,这会导致不必要的内存浪费。
修复方案
推荐使用动态内存分配来解决这个问题,以下是修正后的完整代码:
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int squareSize = atoi(argv[1]); int *matrix[squareSize]; // 修正数组长度为squareSize for(int i = 0; i < squareSize; i++) { // 用malloc分配堆内存,确保每行内存独立且持久 int *line = malloc(sizeof(int) * squareSize); if (line == NULL) { // 检查内存分配是否成功 perror("malloc failed"); return 1; } int *lPointer = line; for(int j = 0; j < squareSize; j++) { *lPointer = atoi(argv[i*squareSize + j + 2]); lPointer++; } printf("L: %d %d %d\n", line[0], line[1], line[2]); matrix[i] = line; } printf("M: %d %d %d %d %d %d %d %d %d\n", matrix[0][0], matrix[0][1], matrix[0][2], matrix[1][0], matrix[1][1], matrix[1][2], matrix[2][0], matrix[2][1], matrix[2][2]); // 释放动态分配的内存,避免内存泄漏 for(int i = 0; i < squareSize; i++) { free(matrix[i]); } return 0; }
核心修改点:
- 把栈上的局部数组
line替换为malloc分配的堆内存,确保每行内存独立,不会被循环复用 - 修正
matrix的数组长度为squareSize - 添加内存分配失败的检查逻辑,以及程序结束前的内存释放步骤
临时替代方案(不推荐)
如果只是临时测试,不想用动态内存,可以把line定义为static int line[sizeof(int) * squareSize];——静态变量会被分配在全局内存区,不会在循环结束后被复用。但这种方式不适合大数组,静态内存空间有限,容易出现溢出问题,仅适合小范围测试。
内容的提问来源于stack exchange,提问作者Cost Death
相关产品推荐
相关产品推荐

