#include <stdio.h>
int main()
{
int i = 0;
int *a;
do
{
scanf("%d",&a[i]);
i++;
}
while (a[i-1]!=-1);
}
此代码读取数字直到-1
遇到。指针a
未初始化,但代码仍然可以编译和运行而没有任何错误。为什么?这可以是一种在不声明其大小的情况下初始化数组的方法吗?
这可以是一种在不声明其大小的情况下初始化数组的方法吗?
不。
所有int *a;
做,如果定义一个指针来int
,这,不被初始化,点的地方,“无门”,为“无效”的记忆。
任何对[]
-operator 的调用,在a
没有事先a
指向任何有效内存的情况下(例如你的代码所做的 OP)都会调用未定义的行为,从那时起,从崩溃到看似正常工作,任何事情都可能发生。
假设“声明”实际上是指“定义”定义具有“未知”大小的数组的唯一方法是在数组定义时提供初始化器(具有众所周知的大小),如下所示:
int arr[] = {-1, 0, 42}; /* Defines arr to be an array of three ints. */
在创建之后右/初始化arr
有三支一众所周知大小int
。
请注意,=
上面的符号与赋值运算符不同=
。以下代码将无法编译:
int arr[];
arr = {-1, 0, 42}; /* Invalid, as an array may not be assigned. */
为了让 GCC 对代码中所有可能可疑的内容更加健谈,在编译时传递以下选项:
-Wall -Wextra -pedantic -Wconversion
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句