字符串数组中的C分段错误

时间:2012-01-28 13:16:04

标签: c

我希望以下代码能够正常运行。它编译(gcc),但执行给出了Segmentation fault: 11。怎么会?感谢

#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]);
    }
}

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

您将所有字符串复制到indici [0],因此其他3个字符串未初始化。

当您打印未初始化的 kaboom 时。