realloc上的地址无效

时间:2013-05-16 02:57:51

标签: c malloc realloc

我正在建立一个程序,它读取一个充满单词的巨型标准。我想将输入分成最多100个字符的字符串。所以这是我的代码。

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

static char* string = "\0";

void getChar(char new){
    if (strcmp(string,"\0") == 0){
        free(string);
        string = (char *) malloc(sizeof(char));
        if (string == NULL){
            exit(EXIT_FAILURE);
        }
        string[0] = new;
    } else {
        char* newString = (char*) realloc(string, sizeof(string)+sizeof(char));
        if (newString == NULL){
            exit(EXIT_FAILURE);
        }
        string = newString;
        string[strlen(string)]=new;
    }
    if (strlen(string) > 100){
        printf("%s\n",string);
        dosomething(string);
        string = "\0";
    }
}

void getInput(){
    int temp;
    while((temp = fgetc(stdin)) != EOF){
        getChar((char) temp);
    }
}

int main(int argc, char *argv[]){
    getInput();
}

编译并执行代码后,我会立即收到错误消息:

*** glibc detected *** ./sort: realloc(): invalid next size: 0x08f02008 //ofc this address always changes

在更高版本中,我将过滤\ n,并且字符串大于100个字符正在被隐藏。

1 个答案:

答案 0 :(得分:3)

sizeof(string)实际上告诉你string 本身的大小(指针,因为那是string的内容),而不是它所指向的东西的长度至。您需要自己跟踪字符串的长度,方法是使用strlen(这意味着它必须始终具有终止零字节)或使用单独的长度变量。

还有很多其他错误。在free(string)指向您分配的空间之前,您的第一个string发生,这是致命的。