编译c代码时发出警告 - 不知道原因

时间:2016-09-24 11:08:25

标签: c

我有以下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];

1 个答案:

答案 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;
  1. var2int的二维数组。
  2. 因此var2[0][0]的类型为int
  3. 因此&var2[0][0]的类型为int*
  4. 因此var1应该是int*类型才能匹配。