可能重复:
Allocate memory for 2D array with minimum number of malloc calls
到目前为止,我对C void指针的关注知识会自动转换为适当的数据类型。以下是我发现警告的程序:
从不兼容的指针类型初始化[默认启用]
#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", &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;
}
但它完美无缺。如果void**
指针的类型被转换为“指向COL大小整数数组的指针”,那么它的行为应该改变并且表现得像2D数组?
答案 0 :(得分:2)
首先,void **
指针不是void *
指针。 void **
和void *
是两种完全不同的类型。无论适用于void *
的转换属性是什么,都不适用于您的ptr
。您的初始化确实无效,正如编译器在警告消息中告诉您的那样。
其次,程序中绝对不需要void **
指针。无论如何它来自哪里?如果你想在你的程序中有一个“中间”指针ptr
,你应该用void *
类型
void *ptr = malloc(ROW * COL * sizeof(int));
int (*p)[COL] = ptr;
警告就会消失。但是,正如我在之前的回答中所说,在这种情况下,不需要任何中间指针。你可以做到
int (*p)[COL] = malloc(ROW * sizeof *p);
答案 1 :(得分:0)
您可以指定指向任何指针的void
指针。但是,您指定一个指向void指针的指针:这是不同的。