2012-01-28 77 views
0

我希望以下代碼能夠正常工作。它編譯(gcc),但執行給出Segmentation fault: 11。怎麼來的?由於字符串數組中的C分段錯誤

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define MAX_INDEX_LENGTH 20 

main() 
{ 
    char **indici; 
    int n = 4; 

    indici = (char **)malloc(n * sizeof(char*)); 
    int i; 
    for (i = 0; i < n; i++) 
    { 
     indici[i] = (char *)malloc(MAX_INDEX_LENGTH * sizeof(char*)); 
    } 

    strncpy(indici[0], "aaa", MAX_INDEX_LENGTH); 
    strncpy(indici[0], "bbbb", MAX_INDEX_LENGTH); 
    strncpy(indici[0], "ccccc", MAX_INDEX_LENGTH); 
    strncpy(indici[0], "ddddddd", MAX_INDEX_LENGTH); 

    for (i = 0; i < n; i++) 
    { 
     printf("Index %d is %s\n", n, indici[n]); 
    } 
} 
+0

有用的答案尚未發佈,但我想指出你正在分配'MAX_INDEX_LENGTH * sizeof(char *)'而不是'MAX_INDEX_LENGTH * sizeof(char)',這是你真正想要的。 – 2012-01-28 13:22:31

回答

1

你所有的字符串轉換爲indici的複製[0],所以其他3是未初始化的。

當您打印未初始化的文件時,kaboom

2

你不填充所有的元素,只有indici[0]所以他們仍然未初始化的並且很可能點垃圾。所以當第二個for運行它將取消未初始化的東西。

也許你的意思是:

strncpy(indici[0], "aaa", MAX_INDEX_LENGTH); 
strncpy(indici[1], "bbbb", MAX_INDEX_LENGTH); 
strncpy(indici[2], "ccccc", MAX_INDEX_LENGTH); 
strncpy(indici[3], "ddddddd", MAX_INDEX_LENGTH); 

的第二個問題是,你想打印indici[n],這是分配的內存之外。你可能意味着

printf("Index %d is %s\n", i, indici[i]); 

另一個微妙的問題是這樣的:

(char *)malloc(MAX_INDEX_LENGTH * sizeof(char*)); 
             ^^^^^^ 

你分配比你更需要。你需要分配一些字符,所以它應該是sizeof(char)。但是sizeof(char)始終爲1所以它應該是:

malloc(MAX_INDEX_LENGTH); 
+0

試着運行它,它也會崩潰。 OP在上一個循環中有問題。 – taskinoor 2012-01-28 13:26:48

+0

是的,我只注意到並編輯了答案,謝謝:-) – cnicutar 2012-01-28 13:27:31