gpt4 book ai didi

c - 初始化数组的两种方法。每一个会发生什么?

转载 作者:太空狗 更新时间:2023-10-29 15:19:40 24 4
gpt4 key购买 nike

在C中有两种(至少)初始化数组的方法,两者有什么区别

int array[] = {1,2,3,4,5,6,7,8,9} ;

和:

int array[100] = {1,2,3,4,5,6,7,8,9} ;

我不是指内存分配方式。或许引发这个问题的事情有助于理解我的问题。

我想通过遍历 int 数组来获取它的长度。这是代码:

#include <stdio.h>
#include <stdlib.h>
int array[] = {1,2,3,4,5,6,7,8,9} ;
int i = 0 ; // i is length
while( array[i] ) {
printf("%d\n" , array[i] ) ;
i++ ;
}
printf("%d\n" , i) ;

而且我注意到,当我使用 array[] 时,由于某种溢出,长度有时是错误的,但是当我使用 array[100] 时,长度总是正确的。这两者有什么区别?它与'\0'字符有关吗?

最佳答案

当您创建数组但未指定其大小时,编译器会从初始值设定项中推断出它(在本例中,长度为 9)。紧跟在数组之后的内存位置具有未指定的内容,因为没有人费心给它们指定特定的值,这就是为什么会出现“溢出”行为——这在技术上是未定义行为,但结果很常见编译器供应商实现“未定义”的方式。

当您显式指定大小时,编译器会使用您提供的尽可能多的元素初始化数组,然后用零填充剩余空间。

在这两种情况下,行为都符合标准。

关于c - 初始化数组的两种方法。每一个会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25494756/

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