gpt4 book ai didi

c - 如果 void** 指针被类型转换为 "pointer to a COL size integer array"那么它的行为应该改变并且表现得像二维数组?

转载 作者:行者123 更新时间:2023-11-30 14:24:11 26 4
gpt4 key购买 nike

Possible Duplicate:
Allocate memory for 2D array with minimum number of malloc calls

据我所知,C void 指针会自动转换为适当的数据类型。下面是我发现警告的程序:

initialization from incompatible pointer type [enabled by default]

#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 数组?

最佳答案

首先,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);

关于c - 如果 void** 指针被类型转换为 "pointer to a COL size integer array"那么它的行为应该改变并且表现得像二维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12136797/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com