簡體   English   中英

C全局非大小數組?

[英]C global unsized array?

我們有一個學校項目,任何使用C的信息系統。為了保留動態大小的學生記錄列表,我選擇了一個鏈表數據結構。 今天早上我的朋友讓我看看他的系統。 我對他的記錄清單感到驚訝:

#include <stdio.h>
/* and the rest of the includes */

/* global unsized array */
int array[];

int main()
{
    int n;
    for (n=0; n < 5; n ++) {
         array[n] = n;
    }


    for (n=0; n < 5; n ++) {
         printf("array[%d] = %d\n", n, array[n]);
    }
    return 0;
}

與代碼一樣,他聲明了一個未整理的數組,它是整個程序的全局(在bss段中)。 他能夠通過用非零值的值覆蓋后續的內存塊來為數組添加新條目,這樣他就可以遍歷數組:

for (n=0; array[n]; n++) {
    /* do something */
}

他用過(我也用它測試過)Turbo C v1。 我在linux中嘗試過它也可以。

由於我之前從未遇到過這種技術,我認為它存在問題。 所以,是的,我想知道為什么這是一個壞主意,為什么更喜歡這個鏈接列表。

int array[];

技術上稱為不完整類型數組 簡單地說它相當於:

int array[1];

這不好只是因為:

  1. 它會產生未定義的行為 不完整類型的數組的主要用途是在Struct Hack中 請注意,在C99中標准化的不完整數組類型以前它們是非法的。

這是未定義的行為 您正在寫入未分配的內存(超出陣列)。 為了編譯它,編譯器至少分配了一個元素,然后你就開始編寫了這個元素。 嘗試更大范圍的數字。 例如,如果我在Linux上運行您的代碼它可以工作,但如果我將循環更改為50,000,它會崩潰。

編輯代碼可能適用於n小值,但對於較大的值,它將失敗。 為了證明這一點,我編寫了代碼並測試了n = 1000

這是CODEPAD的鏈接,您可以看到,對於n = 1000,會發生分段錯誤

雖然使用相同的編譯器使用相同的代碼,但它適用於n = 10,請參閱此鏈接CODEPAD 所以這稱為未定義行為

如果使用鏈接列表,則可以檢查內存是否正確分配。

int *ptr;
ptr = (int *)malloc(sizeof(int))
if(ptr==NULL)
{
  printf("No Memory!!!");
}

但是使用你的代碼,如果使用具有大邊界的數組進行測試,程序就會崩潰。

暫無
暫無

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

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