编辑:提示出现了两次,不是因为函数中存在潜在错误,而是因为我缺乏注意力,最终导致我调用 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 的结果)
最佳答案
你犯了几个错误。那么让我们来列举一下:
sizeof
是编译时操作(1)。它将根据其操作数的类型计算结果为size_t
常量。因此,sizeof(getWord())
与sizeof(void*)
相同。因此,您为单个指针分配存储空间。如果此行打印任何内容,则您的编译器存在严重错误。这一行
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/