簡體   English   中英

字符串指針數組

[英]array of pointers to strings

在C編程中,我們無法使用scanf()函數獲取值到指針數組

int main()
{
char *names[6];
int loop;
scanf("%s",names[1]);
printftf("\n%s",names[1]);
}

它正在工作,當我把輸入作為程序,我認為它是存儲輸入,但它正確打印輸出作為給定的輸入。之后,它給出了分段錯誤...但是當我在循環中做同樣的獲得6個字符

int main()
{
 char *names[6];
 int loop;
 for(loop=0;loop<6;loop++)
 scanf("%s",names[1]);
 for(loop=0;loop<6;loop++)
 printf("\n%s",names[1]);
 }

它不工作請給我答案...

問題是您沒有為這些名稱分配任何空間。 如果要將其與scanf一起使用,則需要初始化數組中的每個元素。

char* names[6];
for( int i = 0; i < 6; ++i )
    names[i] = malloc( 256 * sizeof *names[i] ); // or some other max value

scanf( "%s", names[1] );

否則這些指針將指向您內存中的任何位置,並且嘗試讀取/寫入這些位置最終將導致分段錯誤

在你的代碼names是一個由6個指針組成的數組。 現在,每個指針都可以存儲新字符串的起始點(第一個字符的地址)。 這意味着您可以在names變量中存儲6個不同字符串的起始地址。

但是當你使用一個循環來初始化每個字符串時,你需要告訴機器每個字符串可能的長度,以便它可以分配一個連續的地址塊,其第一個地址可以存儲在你的指針中以引用你的串。 因此,您必須分配一個您認為足以存儲字符串的特定大小(例如:256字節,1字節為1個字符)。 如果沒有這個,機器不知道在哪里存儲字符串的所有字節,並由於非法內存訪問而引發分段錯誤。

因此,為此,必須為每個6個指針分配一些空間來存儲字符串。 這將使用malloc()在您的循環中完成。 基於@ K-ballo的代碼:

char* names[6];
int max_length = 256; // The maximum length you expect
for( int i = 0; i < 6; ++i )
    names[i] = malloc( max_length * sizeof(char) ); // allocates max_length number of bytes

scanf( "%s", names[1] );

所以現在你基本上有6個不同的max_length連續字符地址塊,每個地址都由names[i]引用。 當你執行scanf()它從標准輸入中讀取字節,然后將這些字節放入由名稱[1]引用的內存中的這些分配字節中。

我在開始時很難理解這一切,所以只是想一個精心的解釋會有所幫助。 :)

暫無
暫無

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

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