Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为具有最少malloc调用数的2D数组分配内存_C_Malloc_Runtime Error - Fatal编程技术网

为具有最少malloc调用数的2D数组分配内存

为具有最少malloc调用数的2D数组分配内存,c,malloc,runtime-error,C,Malloc,Runtime Error,我使用下面的代码段,使用最少的malloc()调用为2D数组分配内存 我想使用下标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 <

我使用下面的代码段,使用最少的
malloc()
调用为2D数组分配内存

我想使用下标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;
}
#定义第3行
#定义列2
int main()
{
void**ptr=malloc(行*COL*sizeof(int));
int(*p)[COL]=ptr;
int i,j;
对于(i=0;i
无论输入什么,程序都能正确输出


但是,它正在显现。为什么?

如果数组维度在编译时已知(如您的示例中),那么您确实可以在一次
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]
(注意
*
)的形式访问数组。选择你喜欢的方法。

试试这个:

#define ROW 3
#define COL 2

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

    int *p[COL];
    int i, j;

    fot (i = 0; i < COL; i++)
        p[i] = ptr + ROW * i;

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

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

    free(ptr);
    return 0;
}
#定义第3行
#定义列2
int main()
{
int*ptr=(int*)malloc(ROW*COL*sizeof(int));
int*p[COL];
int i,j;
fot(i=0;i
否,您看到的是输入。程序没有输出任何东西。
scanf
输入不应该读入
p
,而不是
ptr
?是的,明白了。我感到困倦。我的错。不要理会我以前关于混合指数的评论。我错了。指数很好,呃。。。您正试图通过一个完全未初始化的指针
p
访问
p[i]
。这只会崩溃(最多)。我在第一个循环中初始化指针数组“p”。您无法初始化任何内容,因为您还没有数组。您的
p
被声明为
int(*p)[COL]
。此声明创建指向数组的指针(而不是您错误地认为的“数组或指针”)。此指针未初始化,即它不指向任何地方。您正试图将
[]
运算符应用于不指向任何地方的指针。正如我上面所说的,这将无望地崩溃。试试看。我会试试看,如果是错的,我会更正/删除这个答案。如果你想声明一个“指针数组”,你应该使用
int*p[COL]
(注意:没有大括号)。使用大括号
int(*p)[COL]
p
声明为指向数组的指针,而不是指针数组。