错误 cygwin_exception::open_stackdumpfile: 转储堆栈跟踪是什么?

问题描述 投票:0回答:1

我正在做一个项目,我需要打印搜索到的结构,但是当我打印时,它会执行第一次打印,然后退出运行并给出以下错误: error 我搜索了错误,这通常是动态内存的问题,但这不应该是我的情况,因为我只打印那里的内容,据我所知,我没有添加任何内容。

打印功能:

void printCompany(Companies companies, int i) {
    printf("\nNif: %d", companies.companies[i].Nif);
    printf("\nName: %s", companies.companies[i].name);
    printf("\nCategory: %s", companies.companies[i].categories);
}

结构:

#define COMPANY_INITIAL_SIZE 20
#define SEARCHES_INITIAL_SIZE 20
#define ACTIVITIES_INITIAL_SIZE 20

#define TEXT_MAX_SIZE 200
#define NAME_MAX_SIZE 50
#define EMAIL_MAX_SIZE 50
#define TITLE_MAX_SIZE 50
#define STREET_MAX_SIZE 70
#define LOCATION_MAX_SIZE 70

#define NIF_MIN_SIZE 100000000
#define NIF_MAX_SIZE 999999999

    enum category {
        microCompany = 1, pmeCompany, macroCompany
    };

    enum state {
        inactive, active
    };

    enum searchCamp {
        nif, businessArea, nameLocation
    };

    typedef struct {
        char title[TITLE_MAX_SIZE];
        char text[TEXT_MAX_SIZE];
        char userName[NAME_MAX_SIZE];
        char userEmail[EMAIL_MAX_SIZE];
    } Coment;

    typedef struct {
        int nota;
        char userName[NAME_MAX_SIZE];
        char userEmail[EMAIL_MAX_SIZE];
    } Rating;

    typedef struct {
        int Nif;
        char name[NAME_MAX_SIZE];
        enum category categories;
        int businessAreaCode;
        enum state states;
        char street[STREET_MAX_SIZE];
        char location[LOCATION_MAX_SIZE];
        int postalCode;
        int nComents;
        Coment coments;
        int nRating;
        Rating ratings;
    } Company;

    typedef struct {
        int counter, size;
        Company *companies;
    } Companies;

    void freeCompanies(Companies *);
    void loadCompanyFile(Companies *, char*);
    void saveCompanyFile(Companies *, char *);
    void insertCompanies(Companies*);
    void expandCompanySize(Companies *);
    void searchNifCompanies(Companies);
    //void printCompany(Company);
    void printCompany(Companies,int);

调用打印函数的函数:

/**
 * @brief This function compares the element 
 * @param companies The struct Companies.
 * @param nif The unique value of a company
 * @return if sucesseful returns the index of the company found, if  unsucesseful returns -1.
 */
int searchNifCompany(Companies companies, int nif) {
    int i;
    for (i = 0; i < companies.counter; i++) {
        if (companies.companies[i].Nif == nif) {

            return i;
        }
    }

    return -1;
}

/**
 * @brief This function 
 * @param *companies The pointer of the struct Companies.
 * @return 
 */
void searchNifCompanies(Companies companies) {
    int company, nif;

    nif = getInt(NIF_MIN_SIZE, NIF_MAX_SIZE, "\nNIF[9 digits]: ");
    company = searchNifCompany(companies, nif);

    if (company != -1) {
        //printCompany(companies.companies[company]);
        printCompany(companies, company);
    } else {

        puts("The company doesn't exist.");
    }
}

即使我手动告诉打印结构,它也给了我相同的结果:

Companies companies;

int main() {
    
    loadCompanyFile(&companies, COMPANIES_FILE_NAME);

    mainMenu();
    
    printf("\nNif: %d", companies.companies[1].Nif);
    printf("\nName: %s", companies.companies[1].name);
    printf("\nCategory: %s", companies.companies[1].categories);
    
    saveCompanyFile(&companies, COMPANIES_FILE_NAME);
    freeCompanies(&companies);
    return (EXIT_SUCCESS);
}
c string data-structures
1个回答
0
投票

您应该收到一些关于

printf
的错误参数类型的编译器警告:

printf("\nCategory: %s", companies.companies[i].categories);

您正在传递一个整数值,而不是字符串中第一个字符的地址。

这是对你的

printf
功能的欺骗。虽然您承诺提供字符串的地址(通过使用
%s
格式说明符),但您传递的值不是有效地址。并且它也可能小于地址值。
printf
依赖于您信守承诺并按照您所说的那样接受该价值..

这将导致非法内存访问,从而触发堆栈转储。

始终听取编译器发出的警告。如果您没有收到消息,请提高警告级别。

对于 GCC 或 Clang 使用

-Wall -Wextra -pedantic

© www.soinside.com 2019 - 2024. All rights reserved.