c - STATUS_ACCESS_VIOLATION 由于 malloc()?

标签 c exception memory status access-violation

<分区>

我正在创建的这个 C 程序在运行时得到一个 STATUS_ACCESS_VIOLATION,我相信这是由于一次初始化所有结构,然后使用 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);
        }
    }
}

具体来说,它发生在以下行:

fscanf(fp, "%d %d %d %d\n", &tracks[i].number, &tracks[i].startnode, &tracks[i].endnode, &tracks[i].minutes);

该函数在以下函数中被调用(案例 3):

void get_file(char textfilename[], int optnumber) {
    struct node *nodes;
    struct track *tracks;
    struct course *courses;
    struct entrant *entrants;
    struct checkpointdata *checkpointdatas;
    char filename[20]; //Array of char for filename
    printf("Enter the name of the %s text file(with file extension) :", textfilename);
    scanf(" %[a-zA-Z._1-9]", &filename);
    switch (optnumber) {
        case 1:
            process_name(filename);
            break;
        case 2:
            process_node(filename, nodes);
            break;
        case 3:
            process_track(filename, tracks);
            break;
        case 4:
            process_course(filename, courses);
            break;
        case 5:
            process_entrant(filename, entrants);
            break;
        case 6:
            process_checkpointdata(filename, checkpointdatas);
            break;
    }

}

它读取第一行没问题,但之后就失败了。由于其他“process_[data]”非常相似,我也试过了。有些会正常工作,有些也会出现异常,有些会在输出时检索垃圾。

我该如何解决这个问题,或者如何分配内存使其不与预分配的内存冲突(如果这确实是问题所在)?

最佳答案

malloc()接受要分配的字节数,而不是元素数。发布的代码仅分配 字节:

tracks = malloc(lines);

这对于 struct track 数组来说是不够的,并且会导致后续的 for 循环写入和读取超出已分配内存块边界的内容。传递元素的大小以及元素的数量:

tracks = malloc(lines * sizeof(*tracks));

请注意,在函数内对 tracks 所做的任何更改仅对该函数可见。由于 tracks 在调用函数后实际上并未使用,因此可以将参数替换为局部变量。

记住对于每个 malloc() 必须有一个 free() .

关于c - STATUS_ACCESS_VIOLATION 由于 malloc()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13875528/

相关文章:

c++ - 尝试研究 shine MPEG Layer-III 编码器 - 获取 "redeclaration of C++ built-in type ' bool'"

c - malloc 一次,然后在结构数组上分配内存

java - FXMLLoader.load(url) 抛出的 IOException 将不会被捕获

python - 检查在 Python 中打开了哪些文件

java - 在 hibernate 中存储集合时出现 org.hibernate.MappingException

C中两个函数的比较

c - 如何在c中将数字存储在字符串中

Mysql Error 2008 客户端内存不足

c - 对主机使用免费会导致段错误

c - 了解多线程共享资源 : shmid, shmat、shmdt