c - 以最少的 malloc 调用次数为二维数组分配内存

标签 c malloc runtime-error

我正在使用下面的代码片段使用最少数量的 malloc() 调用为二维数组分配内存。

我想使用下标访问数组,p[i][j]。

#define ROW 3
#define COL 2

int main()
{
    void **ptr = malloc( ROW*COL* sizeof(int) );

    int (*p)[COL] = ptr;

    int i, j;

    for( i = 0; i < ROW; ++i )
            for( j = 0; j < COL; ++j )
                    scanf("%d", &ptr[i][j]);

    for( i = 0; i < ROW; ++i )
    {
            for( j = 0; j < COL; ++j )
                    printf("%d ", p[i][j]);
            printf("\n");
    }

    return 0;
}

无论输入是什么,程序都能正确输出。

但是,它正在显示 Runtime error .为什么?

最佳答案

如果数组维度在编译时已知(如您的示例所示),那么您确实可以在一个 malloc 调用中分配内存。但是您必须使用正确的指针类型来访问该内存。在您的情况下,这将是您的 p 指针。您的 p 指针声明正确,但出于某种原因您完全忽略了它在 scanf 中的存在,而是使用了 ptr

停止尝试使用 ptr 进行数组访问。使用 p。以 p[i][j] 访问您的数组元素,它应该可以工作。

事实上,我会完全摆脱 ptr 并按照以下方式进行内存分配

int (*p)[COL] = malloc(ROW * sizeof *p);

此外,由于两个维度在编译时都是已知的,您实际上可以将其分配为

int (*p)[ROW][COL] = malloc(sizeof *p);

但在这种情况下,您必须记住以 (*p)[i][j] 访问数组(注意 *)。选择您喜欢的方法。

关于c - 以最少的 malloc 调用次数为二维数组分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12133832/

相关文章:

c - 如何将指针指向的 textf 的内容复制到 char 数组(即指针 -> char 数组)

java - DrawerLayout空指针异常

c - 从命令提示符编译时出现运行时错误 R6034

c - 我在 C 中用于两个集合的 UNION 的代码不起作用

c - 为什么我能够在此 char 数组中存储的字节数比使用 malloc() 提供的字节数多?

c - `malloc()`刚刚分配的内存内容是什么?

c++ 指向字符串数组的指针

c - C语言使用malloc的访问冲突

c - OpenCV 2.1 : Runtime error

c - 创建链表时遇到问题