2010-08-01 2 views
4

Хорошо, я знаю, что здесь есть еще один вопрос об «exc_bad_access», но это похоже на Objective-C и iPhone dev., В то время как мой только обычный C. Я новичок в C и почти с моей первой программой, пока эта ошибка не появилась. Я пытался понять это на пару дней и сошел с ума. Любая помощь приветствуется. глючит функция:exc_bad_access в программе C

void edit (int i){ 
    char* z; 
    char* y; 
    char compare1[] = "on bobbin\b\b\b\b"; 
    char compare2[] = "not on bobbin"; 
    char compare3[] = "have\b\b\b\b\b\b"; 
    char compare4[] = "don't have"; 
    char wrapedit[] = "wrapped"; 
    char haveedit[] = "have"; 
    char editing[9]; 

    FILE *wrappedlist = fopen("../../wrapped", "r+"); 
    FILE *havelist = fopen("../../havelist", "r+"); 

    fseek(wrappedlist, i*14, SEEK_SET); 
    fseek(havelist, i*11, SEEK_SET); 

    printf("Edit? (y=yes, n=no)"); 
    fgets(z, 2, stdin); 

    if ((*z=='y') && (strncmp(haveslist[i], compare4, (size_t)1) == 0)) { 
     printf("Switch \"don't have\" to \"have\"? (y=yes, n=no)"); 
     fgets(y, 2, stdin); 

     if (*y=='y') { 
      fputs(compare3, havelist); 
      fclose(wrappedlist); 
      fclose(havelist); 
      return; 
     } 
     else if(*y=='n'){ 
      fclose(wrappedlist); 
      fclose(havelist); 
      return; 
     } 
     printf("Invalid input."); 
     return; 
    } 

    else if ((*z=='y') && (strncmp(haveslist[i], compare3, (size_t)1) == 0)) { 
     fpurge(stdout); 
     printf("Edit \"wrapped\" or \"have\"?"); 
     fpurge(stdin); 
     fgets(editing, 9, stdin); 

     len = strlen(editing); 
     editing[len-1]='\0'; 

     if (strcmp(editing, wrapedit)==0) { 

     if (strncmp(wrapped[i], compare1, (size_t)1)==0) { 

      printf("Switch \"on bobbin\" to \"not on bobbin\"? (y=yes, n=no)"); 
      fgets(y, 2, stdin); 
      if (*y=='y') { 

       fputs(compare2, wrappedlist); 
       fclose(wrappedlist); 
       fclose(havelist); 
       return; 
      } 
      else if(*y=='n'){ 
       fclose(wrappedlist); 
       fclose(havelist); 
       return; 
      } 
     } 
      else if(strncmp(wrapped[i], compare2, (size_t)1)==0){ 

       fpurge(stdout); 
       printf("Switch \"not on bobbin\" to \"on bobbin\"? (y=yes, n=no)"); 
       fgets(y, 2, stdin); 
       if (*y=='y') { 

        fwrite(compare1, (size_t)strlen(compare1), 1, wrappedlist); 
        fclose(wrappedlist); 
        fclose(havelist); 
        return; 
       } 
       else if(*y=='n'){ 
        fclose(wrappedlist); 
        fclose(havelist); 
        return; 
     } 
       fpurge(stdout); 
       printf("Invalid input."); 
     } 
      fpurge(stdout); 
      printf("You don't want to edit wrapped apparently."); 
      fclose(wrappedlist); 
      fclose(havelist); 
      return; 
     } 
     else if(strcmp(editing, haveedit)==0){ 

      if (strncmp(haveslist[i], compare3, 1) == 0){ 

       printf("Switch \"have\" to \"don't have\"? (y=yes, n=no)"); 
       fgets(y, 2, stdin); 
       if (*y=='y') { 
        fputs(compare4, havelist); 
        fclose(wrappedlist); 
        fclose(havelist); 
        return; 
       } 
       else if(*y=='n'){ 
        fclose(wrappedlist); 
        fclose(havelist); 
        return; 
       } 
       printf("Invalid input."); 
      } 
      else if(strncmp(haveslist[i], compare4, 1)==0){ 

       printf("Switch \"don't have\" to \"have\"? (y=yes, n=no)"); 
       fgets(y, 2, stdin); 
       if (*y=='y') { 
        fputs(compare3, havelist); 
        fclose(wrappedlist); 
        fclose(havelist); 
        return; 
       } 
       else if(*y=='n'){ 
        fclose(wrappedlist); 
        fclose(havelist); 
        return;    
      } 
     } 
      printf("Invalid input."); 
     } 
      printf("Not editing."); 

     fclose(wrappedlist); 
     fclose(havelist); 

     return; 
    } 
    else if(*z=='n'){ 
     fclose(wrappedlist); 
     fclose(havelist); 
     return; 
    } 

    printf("Invalid entry"); 
    fclose(havelist); 
    fclose(wrappedlist); 
    return; 
} 

я могу ввести полукокса к fgets после "Edit?" , но затем я получаю ошибку exc_bad_access. Пожалуйста, помогите, thanks.code:

+3

Просьба, пожалуйста, не отправлять полный код. Мы не хотим читать все это. Если бы вы могли сузить проблему и отправлять только соответствующий код, мы были бы в лучшем положении, чтобы помочь вам. – zneak

+0

Еще лучше, отправьте полный код, но сообщите нам, какие строки являются важными. Иногда просмотр полного кода может помочь также уловить ситуацию. –

ответ

6

Это происходит потому, что ваши указатели указывают на отсутствие памяти.

char* z; // pointer points nowhere 
/* snip */ 
fgets(z, 2, stdin); // writing to pointer that points nowhere: boom! 

Это пытается ввести в z двух следующих персонажей из stdin. Однако z указывает на то, что нигде не будет полезно. Вам нужно, чтобы он указывал на существующую память: объявления одного указателя недостаточно, чтобы получить память рядом с ней.

Вы, вероятно, хотите буфер 2 символов для него:

char z[2]; 

С помощью этого кода z будет указателем на достаточно памяти для 2-х символов. (В C массив может быть передан везде, где ожидается указатель.)

Я не слишком заглядывал в ваш код, но у вас будет такая же проблема для y.

2

Вы не выделили какую-либо памяти для z или yи они остались неинициализированными так fgets пишут случайные адреса.

Смежные вопросы