use*_*559 1 c arrays pointers runtime
据说这个代码中有一个错误,但它运行正常并且具有我期望的输出("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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
Success time: 0 memory: 2248 signal:0
hello world
Run Code Online (Sandbox Code Playgroud)
大问题!
return str;
Run Code Online (Sandbox Code Playgroud)
str是一个局部变量.您不能将其地址传递给调用者,因为它指向的内容不能保证是您分配给它的内容example.如果您定义str为static:这不会是一个问题:
static char str[12];
Run Code Online (Sandbox Code Playgroud)
编辑1
你也可以malloc记忆str:
char *str = malloc(12);
Run Code Online (Sandbox Code Playgroud)
如果选择此方法,则必须记住free动态分配的内存以防止内存泄漏.
另一种方法是制作str全球:
char str[12];
char *example(void)
{
...
}
Run Code Online (Sandbox Code Playgroud)
但是,通常最好尽量限制变量的范围.
编辑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);
}
Run Code Online (Sandbox Code Playgroud)
这种方法的问题在于,通常,调用者不知道要返回的字符串的长度.