全局数组问题未更新,C编程

时间:2019-01-08 11:08:00

标签: c arrays global-variables global

我有一个分布在许多文件中的程序。有许多功能需要访问全局数组。我遇到的问题是在程序启动之前我不知道数组的大小。它打开一个文件,然后下载许多点,然后创建具有相应大小的数组。但是为了使数组成为全局数组,需要在主函数之外声明它,即在我知道点数之前。

我现在想做的是:

file1.c:

#include <stdio.h>
#include "file3.h"
int useful[];
int main()
{
    int useful[10];
    int i;

    for (i = 0; i < 10; i++) {
        useful[i] = i+1;
    }

    SPN();

    return 0;
}

file2.c:

#include <stdio.h>
#include "file3.h"

void SPN() {
    int i;
    for (i = 0; i < 10; i++) {
        printf("%i\n", useful[i]);
    }
}

file3.h:

extern int useful[];
extern void SPN();

我在输出中得到的只是一堆0。起初,我以为file1.c中的第二个int有用[...创建了一个具有不同内部名称的新数组,但是考虑到SPN()不会触发任何分段错误,这似乎没有任何意义。它尝试访问数组范围之外的内存(如果有用[]创建一个数组且未更改,则其默认大小为1,即<10)。救命?

2 个答案:

答案 0 :(得分:4)

int useful[10];并未初始化全局int useful[];或类似的东西。这是一个新变量,这里有循环

for (i = 0; i < 10; i++) {
    useful[i] = i+1;
}

您正在修改第二个useful,而无需触及全局的一个。然后在函数末尾将其丢弃。

而是具有如下这样的全局变量:

int *useful;

并以这种方式初始化它:

useful = malloc(sizeof(int)*10);

答案 1 :(得分:2)

<div class="form-inline comments"> <textarea class="form-control commentText" placeholder="Enter Your Comment"></textarea>&nbsp; <button type="submit" data-cid="@item.RoomId" class="btn btn-primary save"><i class="fas fa-save h3"></i></button>&nbsp; </div> @if(item.Comments!=null) { <table> @foreach(var comment in item.Comments) { <tr> <td>@comment.Text</td> <td><button data-id="@comment.RoomId">Edit</button></td> </tr> } </table> } useful的声明是遮蔽的外部声明。 这意味着您认为正在全局变量中插入(在main中的值)实际上已进入局部变量。

Take a look at the following article about shadowing for more info.

看看scope rules in C.

也可能很有趣