编辑:提示两次不是因为函数中存在潜在错误,而是因为我缺乏关注,最终我调用了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作为一个值。我不明白为什么会这样。此外,内存中地址的基本机制是什么使程序以这种方式运行? (或者它与此无关,它实际上是我误用C的结果)
答案 0 :(得分:2)
你犯了几个错误。所以让我们列举一下:
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)除了可变长度数组,但您不能在代码中使用它们。
答案 1 :(得分:0)
这里有几个问题。
首先,getWord()
似乎被调用了两次。我认为这是因为您将其称为sizeof(getWord())
而不是sizeof getWord()
。后一种形式/表达形式是保证表达不被评估的形式。有关更多信息和更多信息的指示,请参阅cppreference。
第二个问题是您正在分配word_Output
然后将其丢弃。这足以说明
void * returnWord()
{
char * word_Output;
word_Output = getWord();
printf("Your word was: %s\n", word_Output);
}
内存将在getWord
中分配,而word_Output
只会指向该内容。
最后,malloc(sizeof(getWord())
不会按预期工作,因为您有兴趣分配6个字符,但您要分配getWord()
的结果大小。是8个字节 - 指向char的指针的大小。