gpt4 book ai didi

c - 为什么溢出数组初始化会发出警告而溢出赋值却不会?

转载 作者:太空狗 更新时间:2023-10-29 15:11:17 25 4
gpt4 key购买 nike

为什么 int a[5] = {1,2,3,4,5,6} 发出警告而 int a[5] = {1,2,3 ,4,5}; a[5] = 6; 不是吗?

当我最初声明数组大小为 5 时,这样做是一个好习惯吗?

如果我不知道数组的大小怎么办?我可以像这样声明它 int a[] 吗?

最佳答案

Why does int a[5] = {1,2,3,4,5,6} give a warning while int a[5] = {1,2,3,4,5}; a[5] = 6; does not?

赋值会给你一个警告,因为你知道初始化语句中变量的大小,而它显然违反了你声明的大小。您在 a[6] = 6 行中没有来自 a 的数组大小,因此对于编译器来说似乎没问题。当然,警告级别因编译器而异,对于某些编译器,您可以指定额外的警告。

例如,使用 gcc,您可以使用标志 -Wextra-Wall 来获得大量警告。收到警告是一件好事,因为编译器可以帮助您找到可能的警告,而无需调试您的代码。当然,它们只有在您修复它们时才会有用 :-)

Is it a good practice to do this when I initially declared the array size to be 5?

将整数分配给内存中您未声明的位置从来都不是一个好习惯 - 您无法确定该值被写入何处,并且它可能会覆盖另一个变量,或者更糟的是,部分覆盖覆盖一些其他变量或堆栈。正如@PascalCuoq 所指出的那样,由于这种情况因编译器而异,因此称为未定义行为,这是您要不惜一切代价避免的事情。当然,由于它是未定义的,因此您的程序可能会在声明后执行得很好,但这是一种非常糟糕的做法。

然而,初始化一个固定大小的数组并没有错,如果它不会改变的话。您应该避免魔数(Magic Number),而是使用常量,例如 MAX_NUMBER_OF_PERMUTATIONSCURRENCIES_SIZE

Can I declare it like this: int a[]?

将其声明为 int a[] 是初始化固定数组时的简写形式,编译器可以指定元素的数量。例如:

int a[] = {1,2,3}; //this is good
int b[3] = {1,2,3}; //same from above

在过去它通常是 declare int a[]; 但是它并不适用于每个编译器,所以应该避免。 (感谢@PascalCuoq 指出这一点)

What if I don't know the size of my array?

如果您不知道数组的大小,您应该将其声明为指针,如 int * a 并使用 malloc 自行管理内存,realloc, calloc 和类似的系统调用。请做好工作并了解 free - 世界稍后会感谢您。如果您正在寻找动态内存分配,您应该阅读指针而不是数组。

关于c - 为什么溢出数组初始化会发出警告而溢出赋值却不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16241522/

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