realloc()仅运行几次

时间:2017-07-09 23:16:40

标签: c arrays string dynamic allocation

这是我的代码:

int main() {
    char* initials;

    initials = Initials();
    printf("%s", initials);

    free(initials);
}

char* Initials() {
    char* name;
    char* initials;

    name = GetInput();

    return name;
}

char* GetInput() {
    char* input = CreateString();
    char tmpStr[CHUNK];
    size_t inputLen = 0, tmpLen = 0, cap = DEFSIZE - 1;

    do{
        fgets(tmpStr, CHUNK, stdin);
        tmpLen = strlen(tmpStr);
        if( cap <= (inputLen + tmpLen) )
            DoubleString(input, &cap);
        inputLen += tmpLen;
        strcat(input, tmpStr);
    } while(tmpLen == CHUNK-1 && tmpStr[CHUNK-2] != '\n');

    return input;
}

char* CreateString() {
    return (char*)calloc( DEFSIZE, sizeof(char) );
}
void DoubleString(char* str, size_t* cap) {
    char* tmpStr;
    tmpStr = (char*) realloc( str, 2*(*cap) );
    if(tmpStr) {
        str = tmpStr;
        *cap = 2*(*cap) - 1;
    }
    else {
        printf("error!\n");
        free(tmpStr);
    }
}

这段代码编译,但是当我运行它时,它“只能工作”到某个字符串长度 - 输入kingdom种类的作品。但是,由于A horse, a horse! My kingdom for a horse!realloc(): invalid next size:...不会。根据{{​​1}},两者导致内存泄漏。

代码应该使用valgrind加载所有代码。然后我将块从缓冲区复制到数组。如果潜在副本超过数组的实际大小,我会将其大小加倍。

我试过调试。对于fgets,它一直工作到A horse, a horse! My kingdom for a horse!,之后循环第二次进入A horse, a horse。但是,在这次迭代之后,数组变空了!这会让我相信DoubleString()中的作业是不正确的,但直到现在都有效。

那我错在哪里?

编辑:好的,所以虽然我的函数可以改变指向值,但它无法改变指针本身。 DoubleString()成功了。谢谢。

0 个答案:

没有答案