c代码中的分段错误

时间:2014-01-06 12:24:54

标签: c pointers segmentation-fault

我正在检查的代码有问题。我得到一个Segmentation故障(核心转储),我认为问题出在代码的这一部分

代码应该由用户输入将新项目添加到连接列表。

输入应该如下所示

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 个答案:

答案 0 :(得分: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电话,则不会callocfree

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;

答案 1 :(得分:1)

问题出在这一行

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