#include <stdio.h>
int main()
{
int i = 0;
int *a;
do
{
scanf("%d",&a[i]);
i++;
}
while (a[i-1]!=-1);
}
Run Code Online (Sandbox Code Playgroud)
此代码读取数字直到-1遇到.指针a未初始化,但代码仍然编译并运行,没有任何错误.为什么?这可以是一种初始化数组而不声明其大小的方法吗?
默认情况下,GCC不会警告未初始化的值.
您需要-Wuninitialized选项:
gcc -Wuninitialized your_file.c
Run Code Online (Sandbox Code Playgroud)
您应该使用该-Wall选项来启用此警告以及许多其他有用的警告.
在警告选项的详细信息在这里
这可以是一种初始化数组而不声明其大小的方法吗?
没有.
所有int *a;做,如果定义一个指针来int,这,不被初始化,指向某个地方,"无门",为"无效"的记忆.
任何对[]-operator的调用都a没有预先a指出任何有效的内存(例如你的代码所做的OP)会调用未定义的行为,从那时起,从崩溃到看似有效的任何事情都可能发生.
假设通过" 声明 "你实际上意味着"定义",定义具有"未知"大小的数组的唯一方法是在数组的定义中提供一个初始化(具有众所周知的大小),如下所示:
int arr[] = {-1, 0, 42}; /* Defines arr to be an array of three ints. */
Run Code Online (Sandbox Code Playgroud)
右后创建/初始化arr 有三支一众所周知大小 int.
请注意,=上面的符号与赋值运算符不同=.以下代码将无法编译:
int arr[];
arr = {-1, 0, 42}; /* Invalid, as an array may not be assigned. */
Run Code Online (Sandbox Code Playgroud)
为了让GCC更加健谈所有可能在代码中被怀疑的东西,它在编译时会传递以下选项:
-Wall -Wextra -pedantic -Wconversion
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
93 次 |
| 最近记录: |