C - 传递给函数的指针不保留指定的字符串

标签 c pointers malloc

几天前我写了第一行 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/

相关文章:

c++ - 有没有办法找出 C 函数的主要调用者?

c++ - 如何使用迭代器?

c++ - 结构的 std::string 成员的 EXC_BAD_ACCESS 错误

c++ - 获取域 Controller 名称

c - 如何在汇编中使用 float ?

c++ - 相机自动白平衡

C:控制台输出中的垃圾字符

c - 将指针传递给二维数组作为参数

C 将指针传递给指向函数的指针并使用 malloc

winapi - malloc 和 HeapAlloc 之间是否有根本区别(除了可移植性)?