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() 函数似乎没有完成它的工作 - 为什么?
解决方案
您是不了解运算符优先级的受害者。在 C 中,[]
优先级高于*
,因此:
*seqList[curSeqListSize] = ...
说“找到由 指向curSeqListSize
的char**
序列中的插槽,然后取消引用那个。这是错误的。你需要将更高的优先级推到你的表达式中,并且会这样做:char**
seqList
seqList
()
(*seqList)[curSeqListSize] = ...
说“得到char**
指向的seqList
,然后从中得到curSeqListSize
开槽char*
。
我会改变一些其他的东西,但这就是你的轮子从马车上掉下来的地方。
推荐阅读
- c# - 获取列表中的 Wpf DataGrid 数据
- azure - 为 ssh 设置入站 IP 地址过滤器
- python - 在 Sqlalchemy get() 上转换时区
- php - 如何在 PHP 中更正 json?
- html - iPhone 中不显示背景图像
- php - 不允许编辑 php.ini 时通过子域的 PHP 会话
- node.js - 我的简单代码不适用于 express-validator
- android-intent - 无法实例化活动 ComponentInfo?
- ruby-on-rails - dig 方法不能与 ActionController::Parameters 一起正常工作
- dart - 如何在我的应用程序中显示网页,而不会将用户带出应用程序本身?