Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
由于malloc()导致的状态\访问\冲突?_C_Exception_Memory_Status_Access Violation - Fatal编程技术网

由于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

在我创建的这个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 = 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));