2014-01-06 4 views
1

У меня проблема с кодом, который я проверяю. Я получаю ошибку сегментации (core dumped), и я думаю, что проблема находится в этой части кодаошибка segmantation в c-коде

Код должен добавить новый элемент в список подключенных пользователей.

вход должен выглядеть следующим образом

word_#_1999_#_synonym_#_FORIGEN 

спасибо заранее

// Add a new word to the dictionary with the format of { devoted_#_2003,_2001,_2008_#_worship_#_AHAVA } 
struct Word * addWord(struct Word * dictionary) 
{ 
    struct Word *scan = dictionary; 
    struct Word *newWord = (struct Word *)malloc(sizeof(struct Word)); 
    char *input = (char *)malloc(sizeof(char) * 128); 
    char *inputBackup = (char *)malloc(sizeof(char) * 128); 
    char *years = (char *)malloc(sizeof(char) * 128); 
    int count = 0; 
    int tempYear; 
    char *wordOfNewWord; 

    printf("Please enter a new word into dictionary\n"); 
    scanf("%s", input); 
    strcpy(inputBackup, input); 

    // Init newWord 
    newWord = (struct Word *)malloc(sizeof(struct Word)); 
    newWord->next = NULL; 
    newWord->numOfYears = 0; 

    // Check if good 
    if(countSubstring(input, "_#_") != 3) 
    { 
     printf("error\n"); 
     return NULL; 
    } 

    // Get the word name 
    wordOfNewWord = strtok(input, "_#_"); 
    newWord->word = (char *)malloc(sizeof(wordOfNewWord)); 
    strcpy(newWord->word, wordOfNewWord); 

    // Get the word years 
    years = strtok(NULL, "#"); 
    newWord->numOfYears = countSubstring(years, ",_") + 1; 
    newWord->years = (unsigned short *)malloc(sizeof(unsigned short) * newWord->numOfYears); 

    years = strtok(years, ",_"); 
    tempYear = strtol(years, NULL, 10); 

    if (tempYear <= 9999 && tempYear > 0) 
    { 
     *(newWord->years + count) = tempYear; 
    } 
    else 
    { 
     printf("error\n"); 
     return NULL; 
    } 

    count = 1; 
    years = strtok(NULL, ",_"); 
    while (years != NULL) 
    { 
     tempYear = strtol(years, NULL, 10); 

     if (tempYear <= 9999 && tempYear > 0) 
     { 
      *(newWord->years + count) = tempYear; 
     } 
     else 
     { 
      printf("error\n"); 
      return NULL; 
     } 
     count++; 
     years = strtok(NULL, ",_"); 
    } 

    // Get word synonims 
    strcpy(input, inputBackup); 
    input = strtok(input, "#"); 
    input = strtok(NULL, "#"); 
    input = strtok(NULL, "#"); 
    newWord->numOfSynonym = countSubstring(input, ",_") + 1; 
    newWord->synonymWords = (char **)malloc(sizeof(char) * 30 * newWord->numOfSynonym); 

    input = strtok(input, ",_"); 
    *(newWord->synonymWords) = input; 

    count = 1; 
    input = strtok(NULL, ",_"); 
    while (input != NULL) 
    { 
     *(newWord->synonymWords + count) = input; 
     count++; 
     input = strtok(NULL, ",_"); 
    } 

    // Get translation 
    input = (char *)malloc(sizeof(char) * 120); 
    strcpy(input, inputBackup); 
    input = strtok(input, "#"); 
    input = strtok(NULL, "#"); 
    input = strtok(NULL, "#"); 
    input = strtok(NULL, "#"); 
    newWord->numOfTrans = countSubstring(input, ",_") + 1; 
    newWord->tranWords = (char **)malloc(sizeof(char) * 30 * newWord->numOfTrans); 

    input = strtok(input, ",_"); 
    *(newWord->tranWords) = input; 

    count = 1; 
    input = strtok(NULL, ",_"); 
    while (input != NULL) 
    { 
     *(newWord->tranWords + count) = input; 
     count++; 
     input = strtok(NULL, ",_"); 
    } 

    // Put the new word in the dictionary 
    if(findWord(dictionary, newWord->word) == 1) 
    { 
     printf("error\n"); 
     return NULL; 
    } 
} 

есть структура

struct Word 
{ 
    char *word; 
    unsigned short * years; 
    unsigned short numOfYears; 
    char ** synonymWords; 
    unsigned short numOfSynonym; 
    char ** tranWords; 
    unsigned short numOfTrans; 
    struct Word *next; 
}; 
+2

отладчик должен помочь вам. Надеюсь, что вы знаете возможную причину ошибки сегментации. Посмотрите на нее на google. Этого было бы достаточно, чтобы ее найти. –

+5

Снова: _don't литые указатели, возвращаемые 'malloc' при написании C_, указатель void - это все, что вам когда-либо понадобится –

+0

Нет вреда в этом, может быть, лучше практика документации? –

ответ

1

проблема в этой линии

char *wordOfNewWord; 
newWord->word = (char *)malloc(sizeof(wordOfNewWord)); 
strcpy(newWord->word, wordOfNewWord); 
+0

Можете ли вы рассказать о проблеме с этими строками? – Notinlist

+0

sizeof (wordOfNewWord) => sizeof (char *) => 4 или 8 => слишком мал для strcpy –

2

Для стартового, этот код не имеет особого смысла:

if (tempYear <= 9999 && tempYear > 0) 
{ 
    *(newWord->years + count) = tempYear; 
} 

рассматривает только время count используется до этой линии: int count = 0;

Кроме этого, вы, кажется, не обращая внимания к тому, что char ** и char *не то же самое!:

newWord->synonymWords = (char **)malloc(sizeof(char) * 30 * newWord->numOfSynonym); 
//and 
newWord->tranWords = (char **)malloc(sizeof(char) * 30 * newWord->numOfTrans); 

Какие выделения char *, но в то же время, что вы делаете:

char *wordOfNewWord; 
newWord->word = (char *)malloc(sizeof(wordOfNewWord)); 

Что на самом деле выделения памяти для хранения указателя, в зависимости от архитектуры (32 или 64 бит) указатель обычно требует от 4 до 8 раз больше памяти, чем символ, размер которого равен по определению 1.
Распределите память в соответствии с предложениями, высказанными в комментариях:

char **pointers_to_strings = malloc(10*sizeof(*pointers_to_strings)); 
for(int i=0;i<10;++i) 
    pointers_to_strings[i] = calloc(101, sizeof(*pointers_to_strings[i])); 

Для обеспечения того, чтобы вы всегда выделяли необходимый объем памяти, необходимый для размещения любого типа, который он будет удерживать.
И, конечно же, не malloc или calloc без free вызова:

for (int i=0;i<10;++i) 
{ 
    free(pointers_to_strings[i]); 
    pointers_to_strings[i] = NULL; 
} 
free(pointers_to_strings); 
pointers_to_strings = NULL; 
Смежные вопросы