为什么不int a[5] = {1,2,3,4,5,6}发出警告int a[5] = {1,2,3,4,5}; a[5] = 6;呢?
当我最初声明数组大小为5时,这样做是否是一个好习惯?
如果我不知道阵列的大小怎么办?我可以这样声明int a[]吗?
为什么int a [5] = {1,2,3,4,5,6}在int [5] = {1,2,3,4,5}时发出警告; a [5] = 6; 才不是?
赋值会给出一个警告,因为您知道初始化语句中变量的大小,并且它显然违反了声明的大小.你没有a行中数组的大小a[6] = 6,所以对于编译器来说似乎没问题.当然,警告的级别从编译器变为编译器,对于某些编译器,您可以指定额外的警告.
例如,使用gcc,您可以使用标志-Wextra并-Wall获得大量警告.接收警告是一件好事,因为编译器可以帮助您找到可能的警告而无需调试代码.当然,如果你解决它们,它们只会很好:-)
当我最初声明数组大小为5时,这样做是否是一个好习惯?
将一个整数分配给你没有声明的内存中的位置绝对不是一个好习惯 - 你无法确定这个值的写入位置,它可以覆盖另一个变量,或者更糟糕的是,部分覆盖其他变量变量或堆栈.由于这种东西在编译器和编译器之间是不同的,正如@PascalCuoq指出的那样,它被称为未定义的行为,并且是你想要不惜一切代价避免的东西.当然,因为它是未定义的,所以你的程序可能会在这个声明之后执行得很好,但这是一个非常糟糕的做法.
但是,初始化具有固定大小的数组没有任何问题,如果它不会改变的话.你应该避免使用幻数并使用常量,比如MAX_NUMBER_OF_PERMUTATIONS或者CURRENCIES_SIZE.
我可以这样声明:int a []?
int a[]在初始化固定数组时,将其声明为简写,编译器可以指定元素数.例如:
int a[] = {1,2,3}; //this is good
int b[3] = {1,2,3}; //same from above
Run Code Online (Sandbox Code Playgroud)
在过去,通常会声明int a[];它在每个编译器中都不起作用,因此应该避免.(感谢@PascalCuoq指出这一点)
如果我不知道阵列的大小怎么办?
如果你不知道你的数组的大小,你应该声明为指针,喜欢int * a和管理自己使用的内存malloc,realloc,calloc和类似的系统调用.请做好工作并了解free- 世界将在以后感谢你.如果您正在寻找动态内存分配,您应该阅读指针而不是数组.
为什么int a [5] = {1,2,3,4,5,6}在int [5] = {1,2,3,4,5}时发出警告; a [6] = 6; 才不是?
警告只是编译器试图帮助您.每次做错事时,编译器都不必发出警告.编写错误程序的方法太多了,编译器无法对所有程序发出警告.
当我最初声明数组大小为5时,这样做是否是一个好习惯?
不是.当a数组大小为5时,访问a[6]或a[5]调用未定义的行为(翻译:非常糟糕).关于未定义行为的传统说法是它允许编译器使守护进程从你的鼻子中飞出:
在1992年初对该组进行讨论时,常规评论"当编译器遇到[给定的未定义构造]时,让恶魔飞出你的鼻子是合法的"(这意味着编译器可能选择任意任意离奇)在不违反ANSI C标准的情况下解释代码的方法).
因此,简而言之,始终要避免 C程序中未定义的行为.
如果我不知道阵列的大小怎么办?我可以像这样在一个[]中声明它吗?
不,你不能.在声明数组时,您必须知道数组的大小.int a[];会声明一个不完整的数组,这不是你想要的(这里是关于不完整类型的链接,但如果你问的是访问五元素数组的第六个元素,你只是不想听到不完整的类型).如果您不知道最终需要的尺寸,请了解malloc()和realloc().
| 归档时间: |
|
| 查看次数: |
216 次 |
| 最近记录: |