我正在做一个项目,我需要打印搜索到的结构,但是当我打印时,它会执行第一次打印,然后退出运行并给出以下错误: 我搜索了错误,这通常是动态内存的问题,但这不应该是我的情况,因为我只打印那里的内容,据我所知,我没有添加任何内容。
打印功能:
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);
}
您应该收到一些关于
printf
的错误参数类型的编译器警告:
printf("\nCategory: %s", companies.companies[i].categories);
您正在传递一个整数值,而不是字符串中第一个字符的地址。
这是对你的
printf
功能的欺骗。虽然您承诺提供字符串的地址(通过使用 %s
格式说明符),但您传递的值不是有效地址。并且它也可能小于地址值。
printf
依赖于您信守承诺并按照您所说的那样接受该价值..
这将导致非法内存访问,从而触发堆栈转储。
始终听取编译器发出的警告。如果您没有收到消息,请提高警告级别。
对于 GCC 或 Clang 使用
-Wall -Wextra -pedantic