由于malloc()导致的状态\访问\冲突?
在我创建的这个C程序中,我在运行时遇到了一个状态\u访问\u冲突,我相信这是由于一次初始化结构,然后使用malloc()增加它们的大小,导致指针引用已经在使用的内存。这是发生此异常的函数:由于malloc()导致的状态\访问\冲突?,c,exception,memory,status,access-violation,C,Exception,Memory,Status,Access Violation,在我创建的这个C程序中,我在运行时遇到了一个状态\u访问\u冲突,我相信这是由于一次初始化结构,然后使用malloc()增加它们的大小,导致指针引用已经在使用的内存。这是发生此异常的函数: void process_track(char filename[], struct track *tracks) { int i = 0; FILE* fp; int lines; lines = count_file_lines(filename); tracks
void process_track(char filename[], struct track *tracks) {
int i = 0;
FILE* fp;
int lines;
lines = count_file_lines(filename);
tracks = malloc(lines);
fp = fopen(filename, "r");
if (fp == NULL) {
printf("\n\"%s\" File not found", filename);
exit(1);
} else {
for (i = 0; i < lines; i++) {
fscanf(fp, "%d %d %d %d\n", &tracks[i].number, &tracks[i].startnode, &tracks[i].endnode, &tracks[i].minutes);
}
for (i = 0; i < lines; i++) {
printf("%d ", tracks[i].number);
printf("%d ", tracks[i].startnode);
printf("%d ", tracks[i].endnode);
printf("%d\n", tracks[i].minutes);
}
}
}
在以下函数中调用该函数(情况3):
它第一行读得很好,但之后就失败了。由于另一个“过程[数据]”非常相似,我也尝试了这些。有些可以正常工作,有些也会出现异常,有些可以在输出中检索垃圾
我该如何解决这个问题,或者如何分配内存以使其不与预先分配的内存冲突(如果这确实是个问题)接受要分配的字节数,而不是元素数。发布的代码仅分配行
字节:
tracks = malloc(lines);
这对于struct track
数组是不够的,并且会导致后续for
循环写入和读取超出分配内存块的边界。传递元素的大小以及元素的数量:
tracks = malloc(lines * sizeof(*tracks));
请注意,对函数中的轨迹所做的任何更改都只对该函数可见。由于调用函数后实际上没有使用跟踪
,因此可以用局部变量替换参数
记住,每一个malloc()
都必须有一个。我现在明白了-非常感谢,这很有效!关于丢失对轨迹的更改
,为什么更改会丢失在进程_track()
功能之外,因为它是从*轨迹
指针工作的?这是否意味着我必须返回指针?@Wilko,指针也是通过C中的值传递的。要更改指针在函数中指向的内容并使其在函数外部可见,需要传递指针的地址。或者,您也可以返回一个指针。感谢进一步的帮助!是否有我无法更改进程跟踪(文件名,跟踪)的原因代码>到处理跟踪(文件名和跟踪)
将地址传递给函数?@Wilki,yes,并将参数更改为struct tracks**
并在函数中取消引用tracks
:*tracks=malloc(lines*sizeof(**tracks))代码>我设法改变了这些。我将
操作符更改为->
以访问指针处的值(例如&跟踪[I]->编号
,但我现在在fscanf()
行再次遇到状态访问违反
。我认为我只需要取消引用它,然后获得它的地址,因此*(*(&跟踪[I]->number))
,或*跟踪[i]->number,但编译器不喜欢它。您忘记关闭打开的文件。这与崩溃无关,但您现在应该学习好习惯。
tracks = malloc(lines);
tracks = malloc(lines * sizeof(*tracks));