c - 使用 free() 时获取核心转储

标签 c pointers struct malloc coredump

我正在做一项学校作业,驱动程序连同头文件都给了我。我的工作是完成从文本文件读取数据,然后搜索名称并返回电子邮件地址的功能。这是使用指针和结构的巨大练习。

程序读取姓名和电子邮件地址的文本文件,然后使用 malloc() 动态创建结构体数组。 struct Card 由两个 char 指针构建,我使用 strlen()malloc() 内存找到该大小的数据长度并将该结构分配给给定的内存地址。

一切似乎都工作正常,直到最后打印出姓名和电子邮件并即将释放()内存后。我每次都会收到一条中止(核心转储)消息。不知道可能是什么问题。

我在 free() 之前放置了一个 printf() 来尝试找出问题所在,但它似乎是在名称期间发生的/email 打印输出或在它发生之后,因为我的 printf() 测试点(位于 free() 之前的一行)从未被执行。

我假设驱动程序没问题,并且它与我的功能有关。 有人愿意尝试一下吗?

    //Main
    #include <stdio.h>
    #include <stdlib.h>
    #include "lab9utils.h"

    int main(int argc, char * argv[]) {

        // Variable declarations.
        struct Card * cards;
        int size;
        int k;
        char * email;

        // Make sure we have 2 extra command-line paramgers.
        if (argc < 3) {
            printf("Usage:  ./lab9.exe <data_filename> <name_to_lookup>");
            return 0;
        }

        // Get the cards and do the lookup.
        cards = getCards(argv[1], &size);
        email = lookup(cards, argv[2], size);

        // Display the output message ("sorry!" or "name -> email").
        if (email == NULL) {
            printf("Sorry, that name was not in the list of cards.\n");
        } else {
            printf("%s -> %s\n", argv[2], email);
        }

        // Free the memory used by the structures.
        k = 0;
        printf("Test Point#1");
        for (k = 0; k < size; k++) {
            free(cards[k].name);
            free(cards[k].email);
        }
        printf("Test Point#2");
        free(cards);

        return 0;
    }





  // Header

    #ifndef LAB9UTILS_H
    #define LAB9UTILS_H

    struct Card {
        char * name;
        char * email;
    };

    struct Card * getCards(char * filename, int * size);
    char * lookup(struct Card * cards, char * name, int size);

    #endif


   //  Functions

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "lab9utils.h"

    struct Card * getCards(char * filename, int * size_return) {

        int i,size;
        char cTempName[51]={0};
        char cTempEmail[51]={0};

        size = 0;

        //  I/O Setup   
        FILE *fp; 
        fp = fopen(filename,"r");

        //  error checking
        if(fp == NULL)
        {
            perror("Error in opening file");
            return(NULL);
        }

    //  Input Loop      

        while(!feof(fp))
        {
            fscanf(fp,"%s%s",cTempName,cTempEmail);

            size++;
        }   

        size=size-1;

        fclose(fp);

        struct Card * card = (struct Card *)malloc(*size_return * sizeof(struct Card));

        fp = fopen( filename ,"r");

        //  error checking
        if(fp == NULL)
        {
            perror("Error in opening file");
            return(NULL);
        }

        for(i=0;i<size;i++)
            {
                fscanf(fp,"%s%s",cTempName,cTempEmail);
                card[i].name=(char *)malloc((strlen(cTempName)+1));
                card[i].email=(char *)malloc((strlen(cTempEmail)+1));
                strcpy(card[i].name,cTempName);
                strcpy(card[i].email,cTempEmail);

            }

        fclose(fp); 
        //  loop to confirm data was read
        for(i=0;i<size;i++)
                {
                    printf("[ %d ] Name:%s email:%s  Total size:%d\n",i,card[i].name,card[i].email,size);
                }

        *size_return = size;        

        return card;

    }

    char * lookup(struct Card * cards, char * name, int size) {

        int i;

        for(i=0;i<size;i++)
            {
                if (strcmp(cards[i].name,name)==0) 
                {
                    return cards[i].email;
                }
            }

            return NULL;

    }

最佳答案

*size_return 的值是垃圾,因为您仅在函数末尾将其设置为 size

更改此:

struct Card * card = (struct Card *)malloc(*size_return * sizeof(struct Card));

对此:

struct Card * card = (struct Card *)malloc(size * sizeof(struct Card));

关于c - 使用 free() 时获取核心转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25759462/

相关文章:

c - C中的这些枚举有什么区别?

c - C 中按值或指向结构的指针的多个参数

go - 如何解析 TOML 中的嵌套数组/子表?

c - 磁盘 I/O 期间幕后发生了什么?

c - 如何正确处理套接字接受返回 "Too many open files"

C++函数指针错误

c++ - 使用指针允许类充当创建另一个类实例的数据模板的缺点

c - 有没有办法设置套接字选项来指示数据包转到哪个接口(interface)

c - 提供相对路径时加载纹理将不起作用

c - 如何在程序中指针输出?