簡體   English   中英

在此代碼中未初始化數組大小時,為什么gcc o不發出警告?

[英]Why doesn't gcc o warn when size of array is uninitialized in this code?

好的,這是我所遇到的一個錯誤的精簡版本。 錯誤是我使用未初始化的變量初始化了數組。 早些時候,我使用函數來聲明使用函數的元素數量,但是在清理之后,我忘記了它,並將所有聲明移至函數頂部。

我使用了標志-std=c99 -Wall -Wextra -pedantic -O ,並且通常gcc在未初始化值之前就警告它們正在使用的值,但是在這種情況下,它沒有使用。 所以,我的問題是:

這是gcc的錯誤, 還是 f(&n)以某種奇怪的方式后初始化數組大小?

#include <stdio.h>

void f(int * x) {
  *x = 8;
}


int main(void) {

  int n;
  float a[n]; // Compiler should warn that n may contain garbage

  a[7] = 3.1415;
  printf("%f\n", a[7]);

  f(&n);  // Removing this causes the compiler warn as expected

  return 0;
}

編輯:可能是這個gcc錯誤

GCC接受float a[n]作為可變長度數組。 但是,它應該警告您n在使用時包含垃圾。 也許VLA初始化正在以某種方式重新排列,使得該事實對於代碼生成器而言不是顯而易見的? 如果n在使用前進行初始化,移動電話,以f()的聲明,上面a顯然是錯誤的,但這個方案將產生不確定的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM