【发布时间】:2012-04-25 07:00:50
【问题描述】:
我正在尝试使用 realloc() 分配一些内存。到目前为止,这有效。但是,如果我想将分配的内存分配给结构变量中的指针,则会出现分段错误:
// in header
typedef struct {
int a;
char test[20];
} MyContent;
typedef struct {
MyContent* values;
// simmilar to: MyContent values[]
// ... some other stuff
} MyData;
// in source
void myFunction(MyData* dataPtr) {
dataPtr->values = NULL;
MyData* tempPtr = NULL;
for (int i = 1; i < 10; i++) {
tempPtr = (MyContent*) realloc(dataPtr->values, i * sizeof(MyContent));
if (tempPtr == NULL) {
free(dataPtr->values);
break;
}
dataPtr->values = tempPtr; // Here I get the segmentation fault
dataPtr->values[(i-1)].a = 42;
// ...
}
}
我不知道这里出了什么问题。有什么建议么?感谢您的帮助。
【问题讨论】:
-
错误出现在您未粘贴的代码中。上面的代码只有一个重要的问题——它错误地处理了
realloc返回NULL的情况。如果您可以发布一个完整的、可编译的示例来显示错误,我们可能会为您找到它。否则,请在您的代码上运行valgrind。 (顺便问一下,这是 C 代码还是 C++ 代码?你把两个标签都放了,这很混乱。) -
@DavidSchwartz,OP 发布的代码可以在 C 或 C++ 下编译和运行就好了 :)
-
@bdonlan:是的,这样就不可能知道他在问什么。例如,如果我要对其进行测试,我应该将其作为 C 代码还是 C++ 代码进行测试?如果我要建议修复/更改,它们应该是 C 代码还是 C++ 代码?
-
@DavidSchwartz,您可以将自己限制在 C 和 C++ 的交集上,这基本上是 C 的大部分内容(有一些细微差别)。确定使用哪个 OP 会有所帮助,但在不知道的情况下尝试提供帮助并非不可能。只是不要假设
void*自动转换,也不要将变量命名为class:) -
@user1355415,我认为你的最后一次编辑实际上让事情变得更糟 - 你的演员表与现在的 sizeof 一致,但你分配给
dataPtr->values仍然是MyContent*...跨度>
标签: c pointers segmentation-fault realloc