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

时间:2018-02-17 11:57:52

标签: c pointers

#btn {
  margin: 10px;
  padding: 20px;
  width: 470px;
  height: 50px;
  border: 2px solid #f7f7f7;
  text-align: center;
  text-transform: uppercase;
  position: relative;
  background-image:linear-gradient(to right, red,red);
  background-position:50% 100%; /*OR center bottom*/
  background-size:0% 2px;
  background-repeat:no-repeat;
  background-color:#ccc;
  transition: 1s;
}

#btn:hover {
  cursor: pointer;
  background-size:100% 2px;
}

此代码读取数字,直到遇到<input id="btn" type="submit" name="" value="Click">。指针#include <stdio.h> int main() { int i = 0; int *a; do { scanf("%d",&a[i]); i++; } while (a[i-1]!=-1); } 未初始化,但代码仍然编译&amp;运行没有任何错误。为什么?这可以在不声明其大小的情况下初始化数组吗?

2 个答案:

答案 0 :(得分:8)

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

您需要-Wuninitialized选项:

gcc -Wuninitialized your_file.c

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

有关警告选项here

的更多信息

答案 1 :(得分:5)

  

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

没有

如果指针定义为int *a;,则所有int都会执行此操作,如果没有初始化,则指向某处,&#34;无处&#34;,到&#34;无效&#34;存储器中。

[]上调用a - 运算符,而事先没有将a指向任何有效的内存(例如OP代码所执行的操作)调用未定义的行为,从那时起,任何事情都可能发生,从崩溃到看似有效。

假设通过&#34; 声明&#34;你实际上是指&#34;定义&#34;使用&#34; unknown&#34;定义数组的唯一方法大小是通过在数组的定义中提供初始化(具有众所周知的大小),如下所示:

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