2012-01-28 22 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