gpt4 book ai didi

c - 初始化全局数组的所有元素时的垃圾值

转载 作者:行者123 更新时间:2023-11-30 19:11:04 25 4
gpt4 key购买 nike

我有一个全局结构,其中包含一个数组,如下所示:

首次实现:

当我打印索引高于 490 的数组的任何值时,它会打印垃圾值。

#define NUMOFROWS 512

struct matrix {
int freeSpace;
int allocSapce;
unsigned long long bit_matrix[NUMOFROWS];
};

int main() {
struct matrix b;
b.bitmap_matrix[NUMOFROWS] = 0;

printf("MA[0] = %llu \n", b.bitmap_matrix[0]);
printf("MA[5] = %llu \n", b.bitmap_matrix[5]);
printf("MA[511] = %llu \n", b.bitmap_matrix[511]);
return 0;
}

输出:

MA[0] = 0
MA[5] = 0
MA[511] = 140734799804304

第二次实现:

我把它改成了这个,然后就正常了。

#define ROWS 512

struct matrix {
int freeSpace;
int allocSapce;
unsigned long long bit_matrix[NUMOFROWS];
};

int main() {
struct matrix b;
for (int i = 0 ; i < ROWS; i++) {
b.bit_matrix[i] = 0;
}

printf("MA[0] = %llu \n", b.bit_matrix[0]);
printf("MA[5] = %llu \n", b.bit_matrix[5]);
printf("MA[511] = %llu \n", b.bit_matrix[511]);
return 0;
}

输出:

MA[0] = 0 
MA[5] = 0
MA[511] = 0

知道为什么吗?

最佳答案

结构b不是全局的,它具有自动存储(又名在堆栈上)。 struct Matrix 的类型声明是全局的,但实例 bmain 函数的本地函数。

因此它是未初始化的,您未显式初始化的任何成员都未初始化,即使只是读取值也会调用未定义的行为。

此外,您访问的数组元素超出了数组的大小:b.bitmap_matrix[NUMOFROWS] = 0; 也会调用未定义的行为。

这是一个使用初始化器的更简单的版本:

#define ROWS 512

struct matrix {
int freeSpace;
int allocSapce;
unsigned long long bit_matrix[NUMOFROWS];
};

int main(void) {
struct matrix b = { 0 };

printf("MA[0] = %llu\n", b.bitmap_matrix[0]);
printf("MA[5] = %llu\n", b.bitmap_matrix[5]);
printf("MA[511] = %llu\n", b.bitmap_matrix[511]);
return 0;
}

输出:

MA[0] = 0 
MA[5] = 0
MA[511] = 0

关于c - 初始化全局数组的所有元素时的垃圾值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40696544/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com