我想保存一个对象的动态列表。我不允许使用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*
。我想换一些别的东西,但你的轮子就是从马车上掉下来的。