2016-11-14 80 views
-1

我有一個數組char *Input[11]。我使用malloc()爲其分配內存。malloc()後訪問數組時發生突然分段錯誤

for(int i = 0; i < 12; i++) 
     Input[i] = "\0"; 

    for(int i = 0; i < 12; i++) 
    { 

     Input[i] = malloc(256 * sizeof(char)); 
    } 

    for(int i = 0; i < 12; i++) 
    { 
     strcpy(Input[i], "test"); 
    } 

    printf("Input[11] is %s\n", Input[11]); // <- Here the seg fault happens 

當我想要接觸Input[11]後,我得到一個分段錯誤。我知道你在上下文中通常會遇到這個錯誤,因爲Input[11]指向什麼都沒有,所以我猜如何分配內存有問題。訪問Input[10]和以下工作正常。我的valgrind檢查它,這是錯誤消息:

==5633== 1 errors in context 1 of 1: 
==5633== Invalid read of size 1 
==5633== at 0x4098383: vfprintf (vfprintf.c:1632) 
==5633== by 0x409D695: printf (printf.c:33) 
==5633== by 0x8048A15: handle_command (swebsh.c:122) 
==5633== by 0x8048BE6: main (swebsh.c:181) 
==5633== Address 0x6e69622f is not stack'd, malloc'd or (recently) free'd 

不過,我真的不知道這是什麼告訴我,除了的錯誤所在。任何幫助表示讚賞。

編輯:糟糕,簡化代碼時忘記初始化!

+0

Unsimplify它更多一些。如何定義「輸入」?首先發布[MCVE](http://stackoverflow.com/help/mcve),而不是以無效的方式編輯代碼。 – StoryTeller

+0

並閱讀此https://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – StoryTeller

+0

我要發表評論的答案,但它被刪除。將嘗試第二次編輯,看看是否有幫助。 –

回答

2

如果一個數組有N個元素,那麼索引的有效範圍是[0, N-1]在你的代碼片段中,你聲明一個數組有11個元素。因此,陣列的有效索引範圍是[0, 10]

爲了避免這樣的錯誤,你不使用幻數。相反,爲他們使用一些名稱。

您的代碼可以改寫如下方式

#define N 11 

//... 

char *Input[N] = { 0 }; 
int length = 256; 

for(int i = 0; i < N; i++) 
{ 
    Input[i] = malloc(length * sizeof(char)); 
} 

for (int i = 0; i < N; i++) strcpy(Input[i], "test"); 

printf("Input[N - 1] is %s\n", Input[N - 1]); 
+0

非常感謝! –

+0

@Yíu根本沒有。不用謝。:) –