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

#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()函数似乎没有执行其任务-为什么?

最佳答案

你是一个无法理解operator precedence的受害者。在C中,[]的优先级高于*,因此:

*seqList[curSeqListSize] = ...

表示“按照curSeqListSize所指的char**顺序查找char**时隙seqList,然后取消引用。那是错误的。您需要将更高的优先级强加于seqList表达式,而()将执行以下操作:
(*seqList)[curSeqListSize] = ...

表示“获取由char**指向的seqList,然后从中获取curSeqListSize时隙char*
我想换一些别的东西,但你的轮子就是从马车上掉下来的。

07-24 20:11