为什么编译时不会抛出错误?

Hit*_*esh -9 c pointers

#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未初始化,但代码仍然编译并运行,没有任何错误.为什么?这可以是一种初始化数组而不声明其大小的方法吗?

Ron*_*eau 8

默认情况下,GCC不会警告未初始化的值.

您需要-Wuninitialized选项:

gcc -Wuninitialized your_file.c
Run Code Online (Sandbox Code Playgroud)

您应该使用该-Wall选项来启用此警告以及许多其他有用的警告.

在警告选项的详细信息在这里


alk*_*alk 5

这可以是一种初始化数组而不声明其大小的方法吗?

没有.

所有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)