c用循环向数组输入后不能用sizeof得到数组长度?

作者站长头像
站长
· 阅读数 11

大一刚刚接触c,今天突然遇到了一个问题。我用循环向数组输入后不能用sizeof得到数组长度,但直接初始化的就没有问题。请大佬们救救孩子吧,谢谢大佬(问题的核心代码如下:

#include<stdio.h>
int main()
{
    int i = 0, a[] = { 0 }, b[] = { 1,2,3 };//定义变量、数组
    while (1)
    {
        scanf("%d", &a[i]);
        if (getchar() == 10)    break;
        i++;
    }//使用循环输入1 2 3
    printf("%d\n", sizeof(a) / sizeof(a[0]));//输出为1
    printf("%d", sizeof(b) / sizeof(b[0]));//输出为3
    return 0;
}
回复
1个回答
avatar
test
2024-07-12

数组的长度是在定义的时候确定的,之后不会再变化。

你的程序里,a 的长度是 1 ,b 的长度是 3 。

a 的长度并不会因为向 a[1], a[2] 中写了数据而变长。其实,这里向 a[1] 中写数据已经发生了内存越界,在 C 里这叫做未定义行为,意思是语言规范无法保证程序的结果,或者说,程序可能出现任何结果。任何结果包括程序“正常”运行,崩溃,输出“错误”结果,等等。

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容