c - 二维数组(指针到指针)

标签 c

我想用随机数填充二维数组,然后在 main 函数中调用它并打印它。但我无法从 main 访问函数 FillMatrix

#define R 12 //row
#define S 10 //column

void FillMatrix(int m[][S], int row);
int main(int argc, char *argv[])
{
    int i, j;
    time_t t;

    // POINTER TO POINTER
    int **mat = (int **)malloc(R * sizeof(int *));
    if ((mat = (int**)malloc(R*sizeof(int))) == NULL)
    {
        printf("Error");
        return 0;
    }

    for (i = 0; i<R; i++)
        mat[i] = (int *)malloc(S * sizeof(int));

    FillMatrix(mat, R); //<- This line is the problem

    // RAND 0 - 1000
}

void FillMatrix(int m[][S], int row)
{
    int i, j;
    time_t t;
    srand((unsigned)time(&t));
    for (i = 0; i < row; i++)
        for (j = 0; j < S; j++)
            m[i][j] = rand() % 1000 + 0;
}

最佳答案

(mat = (int**)malloc(R*sizeof(int)) 分配了错误的空间量;类型应为 sizeof(int *)或等效的 sizeof *mat。此外,您还会泄漏刚刚在上一行分配的内存。

要解决此问题,请将 if ((mat = (int**)malloc(R*sizeof(int))) == NULL) 更改为 if ( mat == NULL ) .


此外,int **int[][S] 不兼容。 int ** 表示一个数组,其中每一行都是一个单独的分配,但是 int [][S] 表示一个连续的内存块。您必须选择要使用这两种方法中的哪一种。

如果您想使用单独的行,请将函数更改为 void FillMatrix(int **m, int row) (将列数作为参数,而不是使用全局 S)。

或者,如果您想使用连续的内存块,请将分配行更改为 int (*mat)[S] = malloc(R * sizeof *mat);

关于c - 二维数组(指针到指针),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34142676/

相关文章:

c - 如何避免双重释放或损坏 (!prev)

c - 当指针指向使用 malloc() 获得的内存位置时,编译器如何处理 CONST 限定符?

C - 测试主要功能的最简单方法是什么?

c++ - 将 iostream 与 stdio 同步

c - Malloc 来构造;分段故障

c - 如何在 C 中使用 FFTW 从 PortAudio 的样本中提取频率信息

c - 非常基本的 C 函数

c - 在 Windows 和 Linux 上的 CMake 文件中链接数学库

c - 在 C 中编码 HTML 字符

c - 如何运行KMDF驱动程序?