c - 从 C 中另一个函数的指针获取输入

标签 c function pointers

编辑:提示出现了两次,不是因为函数中存在潜在错误,而是因为我缺乏注意力,最终导致我调用 main() 中的两个函数。 。不过,非常感谢那些指出我滥用malloc()的人和sizeof .

我写了这个小 C 代码:

void * getWord()
{
  char * word_Input;
  printf("Enter a word: ");
  word_Input = malloc(6 * sizeof(char));
  scanf("%s", word_Input);
  printf("Your word was: %s\n", word_Input);
  return word_Input;
}

这非常适合要求用户输入并将其打印回屏幕上的用途。

但是,如果我希望单词的打印成为另一个函数的一部分,该函数从 getWord() 函数获取输入,如下所示:

void * getWord()
{
  char * word_Input;
  printf("Enter a word: ");
  word_Input = malloc(6 * sizeof(char));
  scanf("%s", word_Input);
  return word_Input;
}

void * returnWord()
{
  char * word_Output;
  word_Output = malloc(sizeof(getWord()));
  word_Output = getWord();
  printf("Your word was: %s\n", word_Output);
}

它实际上会提示我两次输入值,并采用第二个 word_Input 作为值。我不明白为什么会发生这种情况。此外,使程序以这种方式运行的内存地址的基 native 制是什么? (或者也许与此无关,它实际上是我滥用 C 的结果)

最佳答案

你犯了几个错误。那么让我们来列举一下:

  1. sizeof 是编译时操作(1)。它将根据其操作数的类型计算结果为size_t常量。因此,sizeof(getWord())sizeof(void*) 相同。因此,您为单个指针分配存储空间。如果此行打印任何内容,则您的编译器存在严重错误。

  2. 这一行word_Output = getWord();实际上调用了该函数。因此,您为 word_Output(从 getWord() 返回的值)分配了一个新值,并丢失了之前分配的值。你的程序有漏洞。

由于 getWord 已经分配,​​因此不需要为结果分配更多存储空间。 returnWord 函数可以简化为:

void * returnWord()
{
  char * word_Output = getWord();
  printf("Your word was: %s\n", word_Output);
  return word_Output;
}

这只会分配一次。它还将返回分配的字符串。您的原始代码指定了返回类型 void*,但没有返回任何内容。这会导致程序出现未定义的行为。如果您声明一个函数来返回某些内容,则必须遵循以使程序有效。

如果您不想返回任何内容,请指定 void 返回类型(而不是 void*)并确保释放分配的内存:

void returnWord()
{
  char * word_Output = getWord();
  printf("Your word was: %s\n", word_Output);
  free(word_Output);
}
<小时/>

(1) 可变长度数组除外,但您不会在代码中使用它们。

关于c - 从 C 中另一个函数的指针获取输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45125561/

相关文章:

c - 分配内存不起作用

c - 高斯分布在 C 中帮助不大

r - 在 R 中围绕统计测试编写函数

javascript - 将 javascript 参数字传递给自定义函数

c++ - 检查空字符 C++

json - Golang gin-gonic JSON 绑定(bind)

c - 为什么下面的代码不能编译?

将 =C3=B6 转换为 ö 假设 UTF-8

function - 火卫一的纯度降低

c++ - ptree 迭代器成员未被自动完成识别?