2017-06-01 29 views
2

如何將一些元素添加到全局聲明的char數組&從另一個函數訪問數組的元素?如何添加一個元素到Global char * Array []?

我聲明如下源文件

extern char *ArrayItems[] = {"Item1"}; 

功能1 - 添加元素到數組

void AddSomeElementToGloablArray() 
{ 
    ArrayItems[1] = "Item 2"; 
    ArrayItems[2] = "Item 3"; 
... 
} 

功能2 - 再添加一些元素放入數組

void AddSomeElementToGloablArray() 
{ 
    ArrayItems[3] = "Item 3"; 
    ArrayItems[4] = "Item 4"; 
... 
} 

主要功能 - 要訪問陣列

void Main() 
{ 
    AddSomeElementToGloablArray(); 
    char *ItemValue = ArrayItems[3]; 
} 

我試圖像上面的代碼的元素,但它不返回添加元素。在這裏,我不能傳遞或從函數返回數組。 請任何人幫忙

回答

3
extern char *ArrayItems[] = {"Item1"}; 

我不確定這裏是否需要extern。如果您只在單個源文件中使用它,則不需要extern。如果您需要在多個編譯單元(源文件)之間共享變量,則應該在頭文件中用extern關鍵字聲明它,然後在任何一個源文件中聲明該變量本身。

/* shared.h */ 
extern char *ArrayItems[]; 
/* foo.c */ 
char *ArrayItems[] = {"Item1"}; 

現在,添加一個元素到數組並不是微不足道的。你需要做動態內存分配。如果您使用的是C++,強烈建議您改用std::vector。以下代碼在支持C++ 11的標準編譯器中起作用。

#include <vector> 
#include <iostream> 

std::vector<char const *> ArrayItems = {"Item1"}; 

void AddSomething() 
{ 
    ArrayItems.push_back("Foo"); 
    ArrayItems.push_back("Bar"); 
} 

int main() 
{ 
    std::cout << ArrayItems[0] << std::endl; 
    AddSomething(); 
    std::cout << ArrayItems[1] << std::endl; 
    std::cout << ArrayItems[2] << std::endl; 
    return 0; 
} 

輸出:

Item1 
Foo 
Bar 

我用char const *,而不是char *因爲"Item1"是一個字符串,它不應該在運行時修改反正。

+0

非常感謝你......你的解決方案爲我工作 – JKParthiban

1

簡短的回答:不這樣做。使用std :: vector並調用vector.push_back。

長答案:使用[]聲明的全局數組具有固定寬度,因此您不能通過訪問它的元素編號來創建新成員,因爲訪問超出界限內存時這非常危險。

0

extern關鍵字不會爲ArrayItems分配任何內存。這只是一個聲明而不是一個定義。如果這個變量是在你的項目中的某個其他文件中聲明的,而你想在當前文件中使用,則需要使用extern關鍵字聲明。如果此變量未在其他文件中定義,則可以簡單地刪除該關鍵字。你的代碼將起作用。然而正如其他答案中所建議的那樣,使用全局變量並不是一個好主意。

5

如何添加元素到全球char *Array[]

無法將元素添加到數組中。在數組的生命週期中,其大小永遠不會改變 - 不會添加或刪除任何元素。


解決這個問題的方法是間接:而不是一個普通的靜態/自動陣列的,我們使用一個指針到一個且動態地分配該數組。當你想要更多的元素時,我們只需創建一個新的,更大的陣列,將舊元素複製(可能通過移動)到新元素中並銷燬舊陣列。該數據結構通常被命名爲「可增長數組」或「可調整大小的數組」。

當然,要維護指向動態數組的裸指針會很瘋狂,所以我們要創建一個RAII包裝類,並帶有適當的析構函數等,以確保內存得到正確處理。在這一點上,我將指出標準庫中存在一個可調整大小的數組的封裝器,因此您不需要自己實現一個:std::vector


extern char *ArrayItems[] = {"Item1"}; 

這是形成不良的,因爲文字串不能被轉換爲一個(非const)char*

ArrayItems[1] = "Item 2"; 

這未定義的行爲,因爲索引是陣列的邊界之外。

+0

良好的信息,謝謝 – JKParthiban

相關問題