首页 > 解决方案 > 为什么我的字符串指针动态数组会导致分段错误?

问题描述

我想保存一个动态的对象列表。我不允许使用 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() 函数似乎没有完成它的工作 - 为什么?

标签: c

解决方案


您是不了解运算符优先级的受害者。在 C 中,[]优先级高于*,因此:

*seqList[curSeqListSize] = ...

说“找到由 指向curSeqListSizechar**序列中的插槽,然后取消引用那个。这是错误的。你需要将更高的优先级推到你的表达式中,并且会这样做:char**seqListseqList()

(*seqList)[curSeqListSize] = ...

说“得到char**指向的seqList,然后从中得到curSeqListSize开槽char*

我会改变一些其他的东西,但这就是你的轮子从马车上掉下来的地方。


推荐阅读