Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编译c代码时发出警告-不知道原因_C - Fatal编程技术网

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

编译c代码时发出警告-不知道原因,c,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_fun

我有下面的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;
}
第二次尝试:

var1 = (void *)&var2[0][0];

首先,让我们忽略2D数组方面。这与您对数组和指针的基本误解不太相关,而且会增加额外的复杂性

使用
var1
,您基本上是在试图声明一个全局变量:

int x[];
这是不合法的。根据您的评论,您似乎有一种错误的印象,即它声明了一个指针,但它却声明了一个未指定大小的数组。作为一个全局变量,编译器必须能够为此数组分配内存,但如果不知道其大小,这是不可能的

请注意,如果将这样的声明用于函数参数,则情况会有所不同:

void foo(int x[]);
该函数不为数组分配任何空间;数组必须已经被分配,而函数取而代之的是指向该数组的指针(或者更准确地说,指向数组的第一个元素)

指针和数组不是一回事。数组在某些上下文中衰减为指针,函数参数允许使用这两种语法,但它们在其他方面是不同的


根据您在
check\u func
中尝试执行的操作:

var1 = &var2[0][0];
您可能希望将
var1
声明为:

int* var1;
  • var2
    int
    的2D数组
  • 因此,
    var2[0][0]
    属于
    int
    类型
  • 因此
    &var2[0][0]
    属于
    int*
    类型
  • 因此
    var1
    应为
    int*
    类型以匹配

  • 首先,让我们忽略2D数组方面。这与您对数组和指针的基本误解不太相关,而且会增加额外的复杂性

    使用
    var1
    ,您基本上是在试图声明一个全局变量:

    int x[];
    
    这是不合法的。根据您的评论,您似乎有一种错误的印象,即它声明了一个指针,但它却声明了一个未指定大小的数组。作为一个全局变量,编译器必须能够为此数组分配内存,但如果不知道其大小,这是不可能的

    请注意,如果将这样的声明用于函数参数,则情况会有所不同:

    void foo(int x[]);
    
    该函数不为数组分配任何空间;数组必须已经被分配,而函数取而代之的是指向该数组的指针(或者更准确地说,指向数组的第一个元素)

    指针和数组不是一回事。数组在某些上下文中衰减为指针,函数参数允许使用这两种语法,但它们在其他方面是不同的


    根据您在
    check\u func
    中尝试执行的操作:

    var1 = &var2[0][0];
    
    您可能希望将
    var1
    声明为:

    int* var1;
    
  • var2
    int
    的2D数组
  • 因此,
    var2[0][0]
    属于
    int
    类型
  • 因此
    &var2[0][0]
    属于
    int*
    类型
  • 因此
    var1
    应为
    int*
    类型以匹配

  • 提示:查看
    intvar1[][128]假设
    var1
    是完整类型,您仍然无法分配给数组,而只能分配给它的元素。这不是指针数组吗?否。请在处读取。如果您想要一个指针数组,它需要是
    int*var1[128]
    。(但根据您在
    check_func
    中尝试执行的操作,您实际上希望
    var1
    只是一个
    int*
    )提示:查看
    int var1[][128]假设
    var1
    是完整类型,您仍然无法分配给数组,而只能分配给它的元素。这不是指针数组吗?否。请在处读取。如果您想要一个指针数组,它需要是
    int*var1[128]
    。(但基于您在
    check_func
    中尝试的操作,您实际上希望
    var1
    只是一个
    int*
    )我将尝试。。。谢谢实际上,我正在测试var1(这段代码是我编写的用于检查var1如何初始化的示例代码),因此我认为应该改变声明var2的方式。可能是指针数组*var2[128]或类似的东西?@giboo这取决于你最终想要完成什么。我会试试。。。谢谢实际上,我正在测试var1(这段代码是我编写的用于检查var1如何初始化的示例代码),因此我认为应该改变声明var2的方式。可能是指针数组*var2[128]或类似的东西?@giboo这取决于您最终要完成的任务。