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

时间:2014-07-31 02:22:53

标签: 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;
}

输出:

Success time: 0 memory: 2248 signal:0
hello world

2 个答案:

答案 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()中你可能会在那里得到垃圾输出。