使用动态输入函数的 c 中损坏的大小与prev_size的关系

Corrupted size vs. prev_size in c with dynamic input function

提问人:lucoski 提问时间:6/17/2022 最后编辑:Vlad from Moscowlucoski 更新时间:6/17/2022 访问量:212

问:

我编写了一个函数来动态输入一个字符串,但是当我运行程序并且我写的东西超过 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;
            }
        }
}

C 指针 dynamic-memory-allocation realloc pass-by-value

评论

0赞 Vlad from Moscow 6/17/2022
显示一个最小的完整程序,演示如何调用该函数。
0赞 lucoski 6/17/2022
@VladfromMoscow我添加了主要的

答:

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