【问题标题】:Why no error is thrown in compilation? [closed]为什么编译没有报错? [关闭]
【发布时间】:2018-02-17 11:57:51
【问题描述】:
#include <stdio.h>

int main()
{
  int i = 0;
  int *a;
  do
    {
      scanf("%d",&a[i]);
      i++;
    }
  while (a[i-1]!=-1);
}

此代码读取数字,直到遇到-1。指针a 未初始化,但代码仍可编译和运行而没有任何错误。为什么?这可以是一种在不声明其大小的情况下初始化数组的方法吗?

【问题讨论】:

  • 为什么会出现 compile-time 错误?
  • 代码肯定会死。这是未定义的行为,这意味着实际上任何事情都可能发生。
  • C 给你绞索和刽子手。小心
  • 因为你没有给@987654324分配任何值@ garabage 存储在那里,并且该垃圾具有内存地址并且可以用作数组
  • 我在您的代码中没有看到任何数组。你在做什么?

标签: c pointers


【解决方案1】:

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

您需要-Wuninitialized 选项:

gcc -Wuninitialized your_file.c

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

有关警告选项的更多信息here

【讨论】:

    【解决方案2】:

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

    没有。

    所有int *a; 都会这样做,如果定义一个指向int指针,由于没有被初始化,它指向某处,“无处”,指向“无效”记忆。

    任何对a[]-operator 的调用,没有事先使a 指向任何有效的内存(例如你的代码所做的OP)都会调用未定义的行为,从那时起任何事情都可能发生,从崩溃到看似正常工作。


    假设“declare”实际上是指“定义”,定义具有“未知”大小的数组的唯一方法是在定义数组,像这样:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-21
      • 1970-01-01
      相关资源
      最近更新 更多