我想保存一个动态对象列表。我不允许使用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()函数未完成其工作-为什么?
答案 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
的位置。
我还要更改许多其他内容,但这就是您的车轮掉下车的地方。