gpt4 book ai didi

c - c代码中的段错误

转载 作者:太空宇宙 更新时间:2023-11-04 02:05:36 25 4
gpt4 key购买 nike

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

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

输入应该是这样的

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 位),指针通常需要的内存是 char 的 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;

关于c - c代码中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20949982/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com