2015-01-13 51 views
0

我面对(码= 1,地址=为0x0)线程1:EXC_BAD_ACCESS用C

线程1:EXC_BAD_ACCESS(码= 1,地址=为0x0)

每当我尝试扫描从输入到char *变量的字符串。 我不知道它为什么会发生,因为一切看起来都是正确的。

#include <stdio.h> 
#include <string.h> 
#include <time.h> 
#include <stdlib.h> 

struct date { 
    int year; 
    int month; 
    int day; 
}; 

日期sructure

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; 
} 

回答

0

您正在访问一个空指针,choice声明为char指针从不初始化,你不需要它是一个char指针,可以声明choice作为char阵列也将包含最长的字符串似乎是"InsertDisease"其中有13个字符,所以声明choice这样

char choice[14]; 

,改变scanf

scanf("%13s", choice); 

这样可以防止缓冲区溢出和内存泄漏太(这将通过使用malloc如果你没有正确freechoice后来引起的)。

我看你也不要重新扫描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;,所以应该照顾结束循环。

0
char *choice; 

内存不是分配给指针和你正在做

scanf("%s",choice); 

分配内存的指针,后来尝试扫描值到它。

choice = malloc(30); /* Size can be anything of your wish */ 

所以你正在访问未初始化的指针,这将导致未定义的行为。

一旦使用这种内存做了你需要释放它

free(choice); 
+0

真的吗?但我之前使用过这种风格,而且我从来没有收到过这样的错误,为什么它需要内存分配? '#include int main(){ char * mine; scanf(“%s”,mine); 012fprintf(“%s \ n”,mine); return 0; }' – user21087

+0

@ user21087是的,为了将您的值存储到某个内存位置,您需要为其分配内存。您可以使用'malloc()'完成相同的操作,如图所示 – Gopi

相关问题