我有以下c源。但是我收到了如下所述的警告
void check_func();
int var2[16][128];
int var1[][128];
int i, k;
int main()
{
for (i = 0u; i < 16; i++)
{
for (k = 0u; k < 128; k++)
{
var2[i][k] = 4095;
}
}
check_func();
//printf("%d", var1[0]);
return 1;
}
void check_func()
{
var1 = &var2[0][0];
return;
}
在gcc中编译时会收到警告。
E:\ gcc-2.95.2 \ bin&gt; gcc.exe check.c
check.c:在函数check_func':
check.c:24:
中,var1'的类型不完整
check.c:顶级:
check.c:3:警告:数组`var1'假定有一个元素
此警告的原因是什么以及如何摆脱这种警告? 我尝试将其类型转换为(int(*)[])和(void *),但警告仍然存在。
即。
第一次尝试:
var1 = (int (*)[])&var2[0][0];
第二次尝试:
var1 = (void *)&var2[0][0];
答案 0 :(得分:1)
首先,让我们忽略2D数组方面。它与你对数组和指针的基本误解并不十分相关,并且它增加了额外的复杂性。
使用var1
,您基本上试图声明一个全局变量:
int x[];
这是不合法的。基于您的评论,您似乎错误地认为这声明了一个指针,但它声明了一个未指定大小的数组。作为全局变量,编译器必须能够为此数组分配内存,但在不知道其大小的情况下,这是不可能的。
请注意,如果将此类声明用于函数参数,则会有所不同:
void foo(int x[]);
When used as function parameters, int x[]
and int* x
are interchangeable.该函数不为数组分配任何空间;数组必须已经分配,而函数则采用指向该数组的指针(或更确切地说,指向数组的第一个元素)。
指针和数组不是一回事。数组衰减到某些上下文中的指针,并且函数参数允许使用任一语法,但它们是不同的。
根据您在check_func
中尝试做的事情:
var1 = &var2[0][0];
您可能希望将var1
简单地声明为:
int* var1;
var2
是int
的二维数组。var2[0][0]
的类型为int
。&var2[0][0]
的类型为int*
。var1
应该是int*
类型才能匹配。