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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 02:55:28