提问人:lucoski 提问时间:6/17/2022 最后编辑:Vlad from Moscowlucoski 更新时间:6/17/2022 访问量:212
使用动态输入函数的 c 中损坏的大小与prev_size的关系
Corrupted size vs. prev_size in c with dynamic input function
问:
我编写了一个函数来动态输入一个字符串,但是当我运行程序并且我写的东西超过 15 个字符时,我得到“损坏的大小与prev_size”,我不明白为什么。
int main()
{
char *text = malloc(sizeof(char));
while(1)
{
dynInput(text);
printf("%s\n", text);
}
}
void dynInput(char *text)
{
for(int l = 1, i = 0; 1; l++, i++)
{
text[i] = getchar();
text = realloc(text, sizeof(char) * l);
if(text[i] == '\n')
{
text[i] = '\0';
break;
}
}
}
答:
1赞
Vlad from Moscow
6/17/2022
#1
main 中定义的指针按值传递给函数。text
这意味着函数处理指针值的副本,更改函数中的副本不会更改原始指针。
所以这句话
printf("%s\n", text);
调用未定义的行为,因为在函数调用后,具有无效的值。指针最初指向的内存已重新分配。text
您需要通过引用传递指针。在 C 语言中,通过引用传递意味着通过指向对象的指针间接传递对象。取消引用函数中的指针,您将获得对原始对象的访问权限。
所以该函数应该声明如下
void dynInput(char **text);
并称
dynInput(&text);
但是,当函数创建并返回指针时会更好。
因此,最好将函数声明为
char * dynInput( void );
并称它为
char *text = dynInput();
评论