0

可能重复:
为具有最少 malloc 调用次数的 2D 数组分配内存

据我所知,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 数组?

4

2 回答 2

2

首先,void **指针不是void *指针。void **并且void *是两种完全不同的类型。无论转换属性适用于void *什么,都不适用于您的ptr. 正如编译器在警告消息中告诉您的那样,您的初始化确实无效。

其次,程序中绝对不需要void **指针。无论如何,它是从哪里形成的?如果你想ptr在你的程序中有一个“中间”指针,你应该用void *type声明它

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

警告就会消失。但是,正如我在之前的回答中所说,在这种情况下实际上不需要任何中间指针。你可以做

int (*p)[COL] = malloc(ROW * sizeof *p);
于 2012-08-27T06:01:37.160 回答
0

您可以将指针分配void指向任何指针的指针。但是,您将指针分配给 void 指针:这是不同的。

于 2012-08-27T05:58:48.937 回答