在C中重新分配内存

时间:2014-03-06 05:57:21

标签: c realloc

我认为我在重新分配令牌字符指针时遇到问题,请帮忙。 我搜索了如何重新分配,但我不确定这是否是正确的方法,因为我在运行程序时遇到了MEMORY CORRUPTION错误。

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

1 个答案:

答案 0 :(得分: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也存在同样的问题。