如果void **指针的类型被转换为“指向COL大小整数数组的指针”,那么它的行为应该改变并且表现得像2D数组?

时间:2012-08-27 05:50:41

标签: c

  

可能重复:
  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数组?

2 个答案:

答案 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指针的指针:这是不同的。