【发布时间】:2017-05-01 19:26:32
【问题描述】:
以下代码在没有声明d = *dummy; 的情况下工作正常,这是一个双指针取消引用。但是,如果存在此行,则会发生分段错误。为什么会这样?
代码为数据结构动态分配和初始化内存。我试图简化对返回的指针的访问。
#include <stdlib.h>
#include <stdio.h>
typedef struct s_dummy {
char dummy_number;
} Dummy;
int mock_read_from_external_source() {
return 4;
}
int load_dummies(Dummy** dummies, int* num_of_dummies) {
*num_of_dummies = mock_read_from_external_source();
*dummies = (Dummy*) calloc(*num_of_dummies, sizeof(Dummy));
if (!dummies) {
return 1; // allocation unsuccessful
}
// Iterate dummies and assign their values...
for (int i = 0; i < *num_of_dummies; i++) {
(*dummies + i)->dummy_number = i;
}
return 0;
}
void main() {
Dummy** dummies;
Dummy* d;
int num_of_dummies = 0;
int *p_num_of_dummies = &num_of_dummies;
int err;
err = load_dummies(dummies, p_num_of_dummies);
// Segmentation fault occurs when dummies is dereferenced
d = *dummies;
if (err) {
exit(err);
}
for (int i = 0; i < num_of_dummies; i++) {
printf("Dummy number: %d\n", (*dummies + i)->dummy_number);
}
}
提前致谢。
【问题讨论】:
-
您的调试器会很乐意告诉您程序崩溃的位置。
-
main应该返回int,而不是void。 -
load_dummies(dummies, p_num_of_dummies)具有未定义的行为:它从dummies读取,这是一个未初始化的变量。 -
Dummy** dummies; ... err = load_dummies(dummies, p_num_of_dummies);->Dummy* dummies; ... err = load_dummies(&dummies, &num_of_dummies);。不需要p_num_of_dummies。 -
if (!dummies)-->if (!*dummies)
标签: c pointers malloc dynamic-allocation