繁体   English   中英

c代码中的segmantation错误

[英]segmantation fault in c code

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

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

输入应该如下所示

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

对于启动,这段代码没有多大意义:

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]));

确保您始终分配适当数量的内存,以满足它将容纳的任何类型。
当然,没有free通话的malloccalloc

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;

问题在于这一点

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM