几天前我写了第一行 C 语言,所以请耐心等待。
我正在尝试创建一个从标准输入读取并将其连接到单个字符串中的函数。我有一个可行的解决方案,但它依赖于调用者 free() 在函数内分配的内存,从设计角度来看我不太喜欢它。
工作代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *get_input(void)
{
char *str = malloc(10 * sizeof(*str)); // I know, sizeof char = 1, still learning so I use it for practice/clarity
// [...] malloc error check
char buffer[BUFSIZ];
int buffer_size = BUFSIZ - 1;
while(fgets(buffer, buffer_size, stdin))
{
str = realloc(str, strlen(str) + strlen(buffer) +1);
// [...] malloc error check
strcat(str, buffer);
}
return str;
}
int main(void)
{
char *str_input = get_input();
printf("%s\n", str_input);
free(str_input);
return 0;
}
$ echo "test" | bin/main test
我更希望调用者有责任在传递指针之前分配内存。
有问题的代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void get_input(char *str)
{
char buffer[BUFSIZ];
int buffer_size = BUFSIZ - 1;
while(fgets(buffer, buffer_size, stdin))
{
str = realloc(str, strlen(str) + strlen(buffer) +1);
// [...] malloc error check
strcat(str, buffer);
}
// printf("%s\n", str); <-- this prints normally when uncommented
}
int main(void)
{
char *str_input = malloc(10 * sizeof(*str_input));
get_input(str_input);
printf("%s\n", str_input);
free(str_input);
return 0;
}
$ echo "test" | bin/main
奇怪的是,如果我尝试在退出函数之前打印 str
的值,它会起作用。另外,如果我将函数内的整个代码移至 main,它就可以工作。
我错过了什么?
最佳答案
What am I missing?
您错过了 C 始终使用按值传递。
这意味着您无法更改函数内 main 中的 str
,因为函数中的 str
只是中 str
的副本主要的。无论您对该副本进行多少更改,main 中的 str
都不会改变。
由于您想更改 main 中的 str
,因此函数必须是:
void get_input(char **str)
并被称为:
get_input(&str_input);
作为替代方案,您可以让 get_input
返回一个指针,例如:
char* get_input(char *str)
{
…
return newPointer;
}
并这样调用它:
str_input = get_input(str_input);
关于C - 传递给函数的指针不保留指定的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52338120/