据说这段代码中存在一个错误,但它运行正常并且具有我期望的输出(“hello world”)。 return str
是否有问题?
#include <string.h>
char* example(){
// your code goes here
char str[12];
strncpy(str, "hello world", 11);
str[11] = 0;
printf("%s\n",str);
return str;
}
int main() {
char * check = example();
return 0;
}
输出:
Success time: 0 memory: 2248 signal:0
hello world
答案 0 :(得分:9)
大问题!
return str;
str
是一个局部变量。您不能将其地址传递给调用者,因为它所指向的内容不能保证是您在example
中分配给它的内容。如果您将str
定义为static
,则这不会有问题:
static char str[12];
修改1
您还可以malloc
内存str
:
char *str = malloc(12);
如果选择此方法,则必须记住free
动态分配的内存以防止内存泄漏。
另一种方法是使str
全局:
char str[12];
char *example(void)
{
...
}
然而,通常最好尽量限制变量的范围。
修改2
另一种方法是让调用者为字符串分配内存。以下是一个例子:
void example(char *str, size_t length)
{
strncpy(str, "hello world", length);
str[length - 1] = '\0'; // Guarantee string '\0' terminated
}
int main(void)
{
char str[12];
example(str, sizeof(str));
printf("%s\n", str);
exit(EXIT_SUCCESS);
}
此方法的问题在于,通常,调用者不知道要返回的字符串的长度。
答案 1 :(得分:1)
错误是example()
函数返回指向本地数组str
的指针。当函数返回时,其所有局部变量都不再有效,并且使用指向它们的指针是未定义的行为。
它显然有效,因为main()
函数实际上从未对返回的指针执行任何操作。如果你把
printf("%s", check);
在main()
中你可能会在那里得到垃圾输出。