C中的数组,字符串,指针操作

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)

Fid*_*its 9

大问题!

   return str;
Run Code Online (Sandbox Code Playgroud)

str是一个局部变量.您不能将其地址传递给调用者,因为它指向的内容不能保证是您分配给它的内容example.如果您定义strstatic:这不会是一个问题:

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)

这种方法的问题在于,通常,调用者不知道要返回的字符串的长度.