2013-02-17 63 views
0

因此,我希望有一個數組,其大小最初沒有已知的(從用戶所採取的命令行),但我想把它全局訪問(外部主)。如何交換指針變量來聲明其大小最初未知的aray?

因此,這裏是我做的。

//.h file declaration 
typedef struct res 
{ 
    int popultaion[NB_TYPE]; 
    int alive; 
    int birthat[NB_TYPE]; 
}res_t; 

//.c file 
res_t* res_first = NULL; 

int main(int argc, char* argv[]) 
{ 
    int no_of_mutants = atoi(argv[1]); 
    int i,j = 0; 
    srand(time()NULL); 
    res_t* tem= res_first; 
    for(i = 0; i < no_of_mutants; i++) 
    {  

     for(j = 0; i < NB_TYPE; i++) 
     {    
     tem->popultaion[j] = rand(); 
     } 
     tem++ 
    } 
    //...other code 
    } 

我得到一個分段錯誤,當我調試用gdb,好像它是在這裏它得到SIGSEGV。

 tem->popultaion[j] = rand(); 

我有兩個問題:

  1. 是這種形式嘗試構建使用添加有效的指針數組?儘管地址在技術上是有效的,但我在第一次運行時遇到了段錯誤。
  2. 是從有效的結構體訪問的陣列構件的方法是什麼? (確定它的類型,但只是想確定)?

P.S.我知道malloc,只是可以使用malloc實現相同的功能,但我想知道在更改代碼中的其他任何地方之前是否給我這個問題,以及爲什麼?

+0

懶得解釋了反對票? – as3rdaccount 2013-02-17 06:22:43

+0

只是猜測關於downvote - 你說你知道malloc但不想使用它。如果它仍然有效,爲什麼我們會首先安裝malloc? – 2013-02-17 11:30:22

回答

3

是這種形式嘗試構建使用添加有效的指針數組?儘管地址在技術上是有效的,但我在第一次運行時遇到了段錯誤。

爲什麼要呢?這是NULL,所以你的代碼調用未定義的行爲。當用戶輸入數組中的項目數時,您需要做的是爲其分配內存。

res_first = malloc(sizeof(*res_first) * NUM_OF_ELEMENTS); 

,當然還有,釋放它使用後:

free(res_first); 
+0

請勿將'static'關鍵字與靜態存儲持續時間混淆。 §6.7.6.3p17:「如果聲明發生在任何函數之外,則標識符具有文件範圍和外部鏈接。」 §6.2.4p3:「其標識符被聲明沒有存儲類說明_Thread_local,並且用外部或內部聯動裝置或與存儲類說明靜態對象,具有靜態存儲持續時間」。 §6.7.9p10:「如果具有靜態或線程存儲持續時間的對象未被顯式初始化,則: - 如果它具有指針類型,則將其初始化爲空指針;」 – Sebivor 2013-02-17 06:51:31

+0

@modifiablelvalue你是否想說所有的全局變量都是零初始化的?因爲他們不是。 – 2013-02-17 06:54:32

+0

C.在C中沒有任何東西是「全局變量」。什麼讓你覺得我試圖說?我非常瞭解這個標準,並且我確信上述代碼中的res_first(編輯之前)確實初始化爲空指針。 – Sebivor 2013-02-17 06:57:44

1

你得到分段錯誤,因爲你不分配的內存。您的res_first甚至沒有使用NULL進行初始化,因此它指向了一些隨機的東西。您需要撥打malloc以在所需大小的堆上分配陣列。如果您需要稍後重新分配,請查看realloc

+0

res_first被隱式初始化爲空指針。看到我對H2CO3的反應。 – Sebivor 2013-02-17 06:53:12