2016-10-16 39 views
-2

我有定義爲遵循初始化在C原因分段錯誤值的字符數組

char users[5] = ""; 

我然後通過分配將用戶添加到該陣列遵循

users[0] = "UserOne"; 
users[1] = "UserTwo"; 

然而char陣列,我的程序崩潰了Segmentation Fault

我在網上查了這個,它似乎與記憶有關。我試圖尋找一篇關於分配內存的文章,並找到了malloc。不過,我對malloc函數有點困惑。

我試圖分配內存使用

users = malloc(sizeof(char)); 

誰能給我解釋一下我的字符數組什麼,我做錯了什麼?

+2

'users [0] =「UserOne」;'是錯誤。你的編譯器應該爲這一行報告一些東西。如果不是,那麼你需要弄清楚如何調高編譯器的警告級別。 –

+1

你會很好地閱讀一本關於介紹C概念的書 –

回答

0

char是單個字符。

char* user[5]; 

將是正確的方式來創建指向char數組(字符串)的指針數組。

我不知道= ""在用戶聲明中的用途,但它應該是一個錯誤。你可以做

char* user[5] = { "", "userOne", "userTwo", "", "" }; 
0

char users[5]聲明char對象數組。 "UserOne"是一組char s。 users[0] = "UserOne";試圖將char的數組分配給單個char。你可能不會那樣做。

你應該做的事情如下所示:

char* users[5]; 
user[0] = malloc(8 * sizeof(char)); /* Allocate memory for storing the data, 8 - is the size of "UserOne" */ 
if(user[0] != NULL)     /* Test that the allocation succeeded */ 
    strcpy(user[0], "UserOne");  /* Store the data */ 

請注意,這只是一個例子。

0

我定義爲char類型的數組,隨後

char users[5] = ""; 

(有什麼不對本聲明。這五個字符它正確初始化爲0

然後我通過如下分配將用戶添加到這個陣列中

users[0] = "UserOne"; 
users[1] = "UserTwo"; 

但是,我的程序崩潰與分段錯誤。 (你想 想?

什麼讓你覺得你可以一個存儲指向一個字符串(這是8-char在x86_64和4-char在x86)作爲單個字符users[0]?這同樣適用於users[1]

當您聲明char users[5] = "";時,您已創建了一個char數組,例如,有5 字符可供使用指標,例如:

----------- 
|0|1|2|3|4| 
----------- 

什麼看來你打算做的是創造了一個數組的指針爲char,例如現在

char *users[5] = {NULL}; 

,用指針數組,你可以每個字符串字面的起始地址分配給users陣列,例如

users[0] = "UserOne"; 
users[1] = "UserTwo"; 
... 
users[4] = "LastOneYouCanAdd"; 

想一想,但讓我知道你是否還有其他問題。短的例子是:

#include <stdio.h> 

#define MAXU 5 

int main (void) { 

    char *users[MAXU] = {NULL}; 
    users[0] = "UserOne"; 
    users[1] = "UserTwo"; 
    users[4] = "Straggler"; 

    for (int i = 0; i < MAXU; i++) 
     if (users[i]) 
      printf (" users[%d] : %s\n", i, users[i]); 

    return 0; 
} 

實施例使用/輸出

$ ./bin/usersptr 
users[0] : UserOne 
users[1] : UserTwo 
users[4] : Straggler 

注:在users指針的初始化到NULL需要能夠遍歷並測試是否在上例中已經指定了一個指針)