我有一个分布在许多文件中的程序。有许多功能需要访问全局数组。我遇到的问题是在程序启动之前我不知道数组的大小。它打开一个文件,然后下载许多点,然后创建具有相应大小的数组。但是为了使数组成为全局数组,需要在主函数之外声明它,即在我知道点数之前。
我现在想做的是:
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)。救命?
答案 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>
<button type="submit" data-cid="@item.RoomId" class="btn btn-primary save"><i class="fas fa-save h3"></i></button>
</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.
也可能很有趣