gpt4 book ai didi

c - 在C中重新分配内存

转载 作者:行者123 更新时间:2023-11-30 15:37:27 25 4
gpt4 key购买 nike

我认为重新分配 token 字符指针时遇到问题,请帮忙。我搜索了如何重新分配,但我不确定这是否是正确的方法,因为当我运行程序时出现内存损坏错误。

char* token = (char*)malloc(sizeof(char));
token[0] = '\0';
int c;
do{
c = fgetc(fp);
if(isalnum(c)){ //add to char array
if(isalpha(c))
c = tolower(c);
if(token[0] == '\0'){
token[0] = (char)c;
token[1] = '\0';
}
else{
token = (char*)realloc(token, strlen(token)+2);
int len = strlen(token);
token[len] = (char)c;
token[len+1] = '\0';
}
}
else{ //token
if(token[0] != '\0'){ //add token
struct token* newtoken = (struct token*)malloc(sizeof(struct token));
newtoken->token = (char*)malloc(strlen(token)*sizeof(char));
strcpy(newtoken->token, token);
newtoken->records = NULL;
struct record* newrecord = (struct record*)malloc(sizeof(struct record));
newrecord->fileName = (char*)malloc(strlen(fileName)*sizeof(char));
strcpy(newrecord->fileName, fileName);
newrecord->freq = 1;
tokens = (struct token*)addToken(tokens, newtoken, newrecord);
}
token[0] = '\0';
}
if(feof(fp))
break;
}while(1);

最佳答案

你写道:

char* token = (char*)malloc(sizeof(char));

更清楚地表示为char *token = malloc(1);,这分配了1个字节。

然后你就走了:

token[0] = (char)c;
token[1] = '\0';

将 2 个字节写入 1 字节分配。这是缓冲区溢出,可能是内存损坏的原因。您可以通过从开始时 malloc 两个字节来解决此问题。

您稍后还会覆盖缓冲区:

newtoken->token = (char*)malloc(strlen(token)*sizeof(char));
strcpy(newtoken->token, token);

更改为:

newtoken->token = malloc( strlen(token) + 1 );
strcpy(newtoken->token, token);

请注意,我的版本比你的版本有更少的缺陷,因此更容易阅读,因此更容易发现是否有任何错误。

之后的下一个strcpy也有同样的问题。

关于c - 在C中重新分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22216224/

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