2014-11-07 2 views
-4

Я написал код ниже как небольшую программу для тестирования, прежде чем писать большую программу, основанную на том же базовом принципе. У меня вчера это работало, но сегодня утром его повесили, и я не могу понять, почему.Почему мои назначения указателей приводят к сбою программы

Код навешивается на: new_rec-> next = head;

Просьба ознакомиться с приведенным ниже кодом и поблагодарить за помощь.

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

FILE *fptr; 


struct list { 
    char string[256]; 
    char *ptr; 
    struct list *next; 
}; 

unsigned int breakRemove(char string1[]); 

int main(void) 
{ 
    if ((fptr = fopen("C:\\Users\\mgreene\\Documents\\EmailTemplates\\TestList.txt", "w")) == NULL) 
    { 
    fprintf(stderr, "Error opening file."); 
    exit(1); 
    } 


    int i, j, k, count=0; 
    char ans[256]; 
    char *pAns; 
    pAns = ans; 
    struct list *ptr = NULL; 

    do 
    { 
    puts("\nEnter some text: "); 
    fgets(ans, 256, stdin); 
    breakRemove(ans); 
    if (pAns != '\0'); 
    { 
     count++; 
     printf("\n%d. You typed:\"%s\"", count, pAns); //test for correct pAns pointer assignment 
    } 

    struct list list1; 
    struct list *head = NULL; 
    struct list *new_rec = NULL; 
    struct list *curr_rec = NULL; 
    struct list *next_rec = NULL; 


    new_rec = (struct list*)malloc(sizeof(struct list)); 

    if (!new_rec) 
    { 
     puts("\nMemory Allocation Error"); 
     exit(1); 
    } 
    puts("\nFirst Memory Allocation Successful."); //acknowledge successful memory allocation 
    ptr = pAns; 
    printf("\nptr = %s", ptr); //test for pointer assignment 
    printf("\npAns = %s", pAns); //test for pointer assignment 
    head = ptr; 
    printf("\nhead = %s", head);// test for pointer assignment 

    printf("\nProblem is new_rec->next=head."); //test to isolate problem. 

    new_rec->next = head; 
    printf("\nnew_rec->next = ", new_rec->next); 
    head = new_rec; 
    curr_rec = head; 
    while (curr_rec->next != NULL) 
    { 
     curr_rec = curr_rec->next; 
    } 


    puts("\nList Pointer Memory Allocation Successful."); 
    curr_rec->next = new_rec; 


    new_rec->next = NULL; 
    strcpy(new_rec->string, ans); 
    printf("\n%s", curr_rec->string); 

    if (list1.string != '\0') 
    { 
     fprintf(fptr, "\n%d. %s", count, curr_rec->string); 
    } 

    }while (*pAns != '\0'); 

} 

unsigned int breakRemove(char string1[]) //Function for removing line breaks from fgets. 
{ 
    unsigned int lenString; 

    lenString = strlen(string1); 

    if (string1[lenString-1]=='\n') 
    { 
    string1[lenString-1]='\0'; 
    } 
    return (unsigned char)string1; 
} 
+0

Hung up !? Он перестает выполняться в этой конкретной строке? Как вы установили точку останова? –

+0

Пожалуйста, сушите проблему, используя отладчик, и отправляйте только пример воспроизведения _minimal_. Я бы начал с исправления всех предупреждений, которые вы должны получить. И если у вас их нет, включите уровни предупреждений (до максимума). – Mat

+0

Я получаю два предупреждения. Один для ptr = pAns, а другой - в моей функции breakremove. Это единственные предупреждения, которые я получаю. Это не останавливается, как будто я вставил перерыв, он просто зависает по ранее упомянутой строке. – Matt

ответ

3

Включить предупреждения в вашем компиляторе. Я получил:

../main.c:53:9: warning: assignment from incompatible pointer type [enabled by default] 
../main.c:54:5: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘struct list *’ [-Wformat] 
../main.c:57:5: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘struct list *’ [-Wformat] 
../main.c:62:5: warning: too many arguments for format [-Wformat-extra-args] 
../main.c:44:18: warning: unused variable ‘next_rec’ [-Wunused-variable] 
../main.c:23:13: warning: unused variable ‘k’ [-Wunused-variable] 
../main.c:23:10: warning: unused variable ‘j’ [-Wunused-variable] 
../main.c:23:7: warning: unused variable ‘i’ [-Wunused-variable] 
../main.c: In function ‘breakRemove’: 
../main.c:93:10: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 

Исправить их для хорошего старта. :)

Например, первое предупреждение исходит от

ptr = pAns; 

и тогда это будет head. Вот почему ваша программа вылетает (возможно, одна из причин).

Вы

char *pAns; 
struct list *ptr = NULL; 

а затем назначить одного к другому. Это не имеет смысла. Вы должны попробовать/усердно изучить, так как ошибок достаточно для ответа, чтобы исправить их.

Другой пример здесь:

if (pAns != '\0') 
    ;    <-- suspicious semicolon, remove it 
{ 
    count++; 
    printf("\n%d. You typed:\"%s\"", count, pAns); //test for correct pAns pointer assignment 
} 

Чтобы включить предупреждения о в кодовых блоков, вы можете сделать это:

«установите флажок„Включить все предупреждения компилятора“в настройках => настройка плагинов => компилятор»

или сделать это:

enter image description here

что я нашел here.

+0

У меня только две ошибки. ptr = pAns и один в breakRemove. Я использую Code :: Blocks для компиляции программы. С точки зрения изучения сложнее, это только мой третий месяц кодирования. :) – Matt

+0

Ну @ ​​Matt, все в порядке, мы все были новичками (может быть, я все еще один) когда-то. Я обновил свой ответ. – gsamaras

+1

@ G.Samaras: Единственное, что беспокоит меня этим ответом, это то, что вы вложили в него в 50 раз больше усилий, чем OP в своем вопросе. – ereOn

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