【发布时间】:2018-08-31 06:06:00
【问题描述】:
我正在使用 Visual Studio 2017,并且我在 C 中有此代码。当我在 VS 中运行时它失败了,但是当我使用 gcc 编译时它运行完美。错误是这样的:
GestaoFinanceira.exe 中的 0x779BE643 (ntdll.dll) 引发异常:0xC0000005:访问冲突读取位置 0x00000009。
这是我的代码。
我正在使用这种结构类型:
struct budget {
struct tm time;
float valor;
};
struct geral {
struct budget *b;
int nelem_budget;
};
在 main 中,我调用了一个函数,该函数将从文件中读取并保存值是结构 g->b[] 作为 g->nelem_budget 中的元素数
int main() {
struct geral *g = (struct geral *)malloc(sizeof(struct geral));
readFileBudget(g);
// just to check if the read was ok
showBudget(g->b, g->nelem_budget);
addBudget(g);
// to check again if the item added is ok
showBudget(g->b, g->nelem_budget);
system("Pause");
return 0;
}
这是出现错误的时间:
void addBudget(struct geral *g) {
int month, year;
float value;
// in the future, this values are to be an user input
month = 5;
year = 2015;
value = 5000;
printf("Month: %d, Year: %d, Value: %f\n", month, year, value);
g->b[g->nelem_budget].time.tm_mon = month;
g->b[g->nelem_budget].time.tm_year = year;
g->b[g->nelem_budget].valor = value;
g->nelem_budget++;
struct budget *tmp = NULL;
tmp = g->b;
g->b = realloc(g->b, g->nelem_budget * sizeof(struct budget));
if (g->b == NULL) { //reallocated pointer ptr1
free(tmp);
printf("error-addBudget->realloc");
exit(EXIT_FAILURE);
}
// just for debug
printf("month: %d, year: %d, value: %f\n", g->b[g->nelem_budget - 1].time.tm_mon, g->b[g->nelem_budget - 1].time.tm_year, g->b[g->nelem_budget - 1].valor);
}
我在g->b 数组的末尾有一个空值,这就是为什么我先添加这些值,然后调用realloc。
【问题讨论】:
-
g->nelem_budget的值是多少?
-
请添加函数
readFileBudget的代码 -
realloc()为时已晚。需要在g->b[g->nelem_budget].time.tm_mon = month;或realloc(g->b, g->nelem_budget * sizeof(struct budget));之前是 1 个元素太小。 -
第一个问题的尝试非常好。做得好!您需要显示
geral的实际内容在哪里初始化。 -
请edit您的问题并显示minimal reproducible example,包括输入文件
标签: c visual-studio gcc malloc realloc