为什么动态的字符串指针数组会导致分段错误?

时间:2018-11-13 21:30:26

标签: c

我想保存一个动态对象列表。我不允许使用VLA,所以我写了以下函数:(最初这是我定义的结构列表,但我也用字符串重现了同样的问题。)

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

void appendSeq(char ** seq, char *** seqList, size_t curSeqListSize) {
    if (*seqList == NULL)
        *seqList = (char **) malloc(sizeof(char *));
    else
        *seqList = (char **) realloc(*seqList, sizeof(char *) * (curSeqListSize + 1));
    if (*seqList == NULL)
        exit(EXIT_FAILURE);
    *seqList[curSeqListSize] = *seq;
}

int main()
{
    char *curSeq = "";
    char ** seqList = NULL;

    for (int i = 0; i < 3; i++)
    {
        curSeq = "Sequence";
        char* curSeqCopy = strdup(curSeq);
        appendSeq(&curSeqCopy, &seqList, i);
    }
}

此操作失败并出现分段错误,并且似乎realloc()函数未完成其工作-为什么?

1 个答案:

答案 0 :(得分:1)

您的受害者,因为他们不了解operator precedence。在C语言中,For Each row In ActiveSheet.ListObjects("SheetPotatoData").DataBodyRows.Rows if row.Cells(1,5) = "potato" 'Do something End If Next 的优先级高于[],因此:

*

说“按照*seqList[curSeqListSize] = ... 所指向的curSeqListSize的顺序找到char**插入char**,然后取消引用那个。那是错误的。您需要在seqList表达式中使用更高的优先级,而seqList将做到这一点:

()

说“获取(*seqList)[curSeqListSize] = ... 指向的char**,然后从中获取seqList插入curSeqListSize的位置。

我还要更改许多其他内容,但这就是您的车轮掉下车的地方。