这是我的代码:
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()
成功了。谢谢。