线程 1:C 中的 EXC_BAD_ACCESS(代码 =1,地址 = 0x0)
Thread1: EXC_BAD_ACCESS (code =1, address = 0x0) in C
我面对
Thread1: EXC_BAD_ACCESS (code =1, address = 0x0)
每当我尝试将字符串从输入扫描到 char * 变量时。
我不知道它为什么会发生,因为一切似乎都是正确的。
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
headers
struct date {
int year;
int month;
int day;
};
日期结构
struct patientData {
unsigned int code;
char name[11];
char family[21];
unsigned int age;
char MF;
char disease[11];
unsigned int numOfVisits;
struct date *date1;
struct date *date2;
struct date *date3;
struct patientData *nextPtr;
};
患者数据结构
int isEmpty (struct patientData *sPtr);
void visit ( struct patientData **returned , unsigned int code);
void Insert (struct patientData **sPtr, unsigned int code , char *name , char *family , unsigned int age ,char gender, int tmgh);
void insertDisease (struct patientData **sPtr , char *name , char *family , char *disease );
struct patientData *searchCode (struct patientData **sPtr , unsigned int code, int *returnval);
struct patientData *searchName (struct patientData **sPtr , char *name , char *family);
void searchDate (struct patientData **sPtr , int year , int month , int day );
void delete (struct patientData **sPtr );
void report (struct patientData **sPtr );
函数;
这里(主要)是问题发生的地方。
int main() {
char *choice;
unsigned int code;
char name[11];
char family[21];;
char disease[11];
int searchCodeReturnValue;
unsigned int age;
char gender;
int tmgh;
int year , month , day;
struct patientData *startPtr = NULL;
puts("Enter one of the following options:");
puts("Visit");
puts("InsertDisease");
puts("search");
puts("Delete");
puts("END");
scanf("%s",choice);
while (strcmp(choice, "END") != 0) {
if (strcmp(choice, "Visit") == 0) {
printf("Enter the code:\n");
scanf("%5ui",&code);
struct patientData *a = searchCode(&startPtr,code,&searchCodeReturnValue);
if (searchCodeReturnValue == 1){
visit(&a , code);
}
else if (searchCodeReturnValue == 0){
printf("Enter name:\n");
scanf("%10s",name);
printf("Enter family:\n");
scanf("%20s",family);
printf("Enter age:\n");
scanf("%ui",&age);
printf("Enter gender:\n");
scanf("%c",&gender);
printf("Enter num of last visits:\n");
scanf("%i",&tmgh);
Insert(&startPtr , code , name , family , age , gender , tmgh);
}
}
else if ( strcmp(choice, "InsertDisease")== 0) {
printf("Enter name:\n");
scanf("%10s",name);
printf("Enter family:\n");
scanf("%20s",family);
printf("Enter disease:\n");
scanf("%10s",disease);
struct patientData *namesearch = searchName(&startPtr, name, family);
insertDisease ( &namesearch , name , family , disease );
}
else if (strcmp(choice, "Search")== 0) {
puts("Choose the way you wanna search: \n 1- by code \n 2- by first and last name \n 3- by Date");
int choiceNum;
scanf("%i",&choiceNum);
if (choiceNum == 1) {
printf("Enter the code:\n");
scanf("%5ui",&code);
searchCode(&startPtr, code , &searchCodeReturnValue);
}
else if ( choiceNum == 2){
printf("Enter name:\n");
scanf("%10s",name);
printf("Enter family:\n");
scanf("%20s",family);
searchName(&startPtr ,name , family );
}
else if ( choiceNum == 3){
printf("Enter year:\n");
scanf("%i",&year);
printf("Enter month:\n");
scanf("%i",&month);
printf("Enter day:\n");
scanf("%i",&day);
searchDate(&startPtr , year , month , day);
}
else
puts("Wrong entry");
}
else if (strcmp(choice, "delete")== 0) {
delete(&startPtr);
}
else if (strcmp(choice, "Report") == 0) {
report(&startPtr);
}
else if (strcmp(choice, "END") == 0)
return 0;
else{
puts("wrong!");
return 0;
}
}
return 0;
}
char *choice;
内存没有分配给指针而你正在做
scanf("%s",choice);
为指针分配内存,稍后尝试将值扫描到它。
choice = malloc(30); /* Size can be anything of your wish */
因此您正在访问未初始化的指针,这将导致未定义的行为。
使用完此内存后,您需要释放它
free(choice);
你正在取消引用一个无效的指针,choice
被声明为一个 char
指针并且从未初始化,你不需要它是一个 char
指针,可以声明 choice
也是一个 char
数组,它包含的最长字符串似乎是 "InsertDisease"
,它有 13 个字符,所以这样声明 choice
char choice[14];
并将scanf
更改为
scanf("%13s", choice);
这样你就可以防止缓冲区溢出和内存泄漏(如果你没有正确使用 malloc
free
choice
稍后).
我看到你也没有重新扫描 choice
值,这将使你的循环无限,你应该把它添加到循环的顶部,并在循环外删除它,然后写循环为
while (1) {
scanf("%13s", choice);
.
.
/* check the content of choice with strcmp and process the requested command */
.
.
}
在循环中你有一个 if (strcmp(choice, "END") == 0) return 0;
所以它应该负责结束循环。
我面对
Thread1: EXC_BAD_ACCESS (code =1, address = 0x0)
每当我尝试将字符串从输入扫描到 char * 变量时。 我不知道它为什么会发生,因为一切似乎都是正确的。
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
headers
struct date {
int year;
int month;
int day;
};
日期结构
struct patientData {
unsigned int code;
char name[11];
char family[21];
unsigned int age;
char MF;
char disease[11];
unsigned int numOfVisits;
struct date *date1;
struct date *date2;
struct date *date3;
struct patientData *nextPtr;
};
患者数据结构
int isEmpty (struct patientData *sPtr);
void visit ( struct patientData **returned , unsigned int code);
void Insert (struct patientData **sPtr, unsigned int code , char *name , char *family , unsigned int age ,char gender, int tmgh);
void insertDisease (struct patientData **sPtr , char *name , char *family , char *disease );
struct patientData *searchCode (struct patientData **sPtr , unsigned int code, int *returnval);
struct patientData *searchName (struct patientData **sPtr , char *name , char *family);
void searchDate (struct patientData **sPtr , int year , int month , int day );
void delete (struct patientData **sPtr );
void report (struct patientData **sPtr );
函数; 这里(主要)是问题发生的地方。
int main() {
char *choice;
unsigned int code;
char name[11];
char family[21];;
char disease[11];
int searchCodeReturnValue;
unsigned int age;
char gender;
int tmgh;
int year , month , day;
struct patientData *startPtr = NULL;
puts("Enter one of the following options:");
puts("Visit");
puts("InsertDisease");
puts("search");
puts("Delete");
puts("END");
scanf("%s",choice);
while (strcmp(choice, "END") != 0) {
if (strcmp(choice, "Visit") == 0) {
printf("Enter the code:\n");
scanf("%5ui",&code);
struct patientData *a = searchCode(&startPtr,code,&searchCodeReturnValue);
if (searchCodeReturnValue == 1){
visit(&a , code);
}
else if (searchCodeReturnValue == 0){
printf("Enter name:\n");
scanf("%10s",name);
printf("Enter family:\n");
scanf("%20s",family);
printf("Enter age:\n");
scanf("%ui",&age);
printf("Enter gender:\n");
scanf("%c",&gender);
printf("Enter num of last visits:\n");
scanf("%i",&tmgh);
Insert(&startPtr , code , name , family , age , gender , tmgh);
}
}
else if ( strcmp(choice, "InsertDisease")== 0) {
printf("Enter name:\n");
scanf("%10s",name);
printf("Enter family:\n");
scanf("%20s",family);
printf("Enter disease:\n");
scanf("%10s",disease);
struct patientData *namesearch = searchName(&startPtr, name, family);
insertDisease ( &namesearch , name , family , disease );
}
else if (strcmp(choice, "Search")== 0) {
puts("Choose the way you wanna search: \n 1- by code \n 2- by first and last name \n 3- by Date");
int choiceNum;
scanf("%i",&choiceNum);
if (choiceNum == 1) {
printf("Enter the code:\n");
scanf("%5ui",&code);
searchCode(&startPtr, code , &searchCodeReturnValue);
}
else if ( choiceNum == 2){
printf("Enter name:\n");
scanf("%10s",name);
printf("Enter family:\n");
scanf("%20s",family);
searchName(&startPtr ,name , family );
}
else if ( choiceNum == 3){
printf("Enter year:\n");
scanf("%i",&year);
printf("Enter month:\n");
scanf("%i",&month);
printf("Enter day:\n");
scanf("%i",&day);
searchDate(&startPtr , year , month , day);
}
else
puts("Wrong entry");
}
else if (strcmp(choice, "delete")== 0) {
delete(&startPtr);
}
else if (strcmp(choice, "Report") == 0) {
report(&startPtr);
}
else if (strcmp(choice, "END") == 0)
return 0;
else{
puts("wrong!");
return 0;
}
}
return 0;
}
char *choice;
内存没有分配给指针而你正在做
scanf("%s",choice);
为指针分配内存,稍后尝试将值扫描到它。
choice = malloc(30); /* Size can be anything of your wish */
因此您正在访问未初始化的指针,这将导致未定义的行为。
使用完此内存后,您需要释放它
free(choice);
你正在取消引用一个无效的指针,choice
被声明为一个 char
指针并且从未初始化,你不需要它是一个 char
指针,可以声明 choice
也是一个 char
数组,它包含的最长字符串似乎是 "InsertDisease"
,它有 13 个字符,所以这样声明 choice
char choice[14];
并将scanf
更改为
scanf("%13s", choice);
这样你就可以防止缓冲区溢出和内存泄漏(如果你没有正确使用 malloc
free
choice
稍后).
我看到你也没有重新扫描 choice
值,这将使你的循环无限,你应该把它添加到循环的顶部,并在循环外删除它,然后写循环为
while (1) {
scanf("%13s", choice);
.
.
/* check the content of choice with strcmp and process the requested command */
.
.
}
在循环中你有一个 if (strcmp(choice, "END") == 0) return 0;
所以它应该负责结束循环。