返回包含C中的本地指针的结构

时间:2016-04-07 15:45:37

标签: c arrays memory-management struct

在C中返回包含本地数组的结构是否有效?

例如:

// Define a string type
typedef struct {
    char* c_str;
} string;

// Function to append 2 strings
string string_append(string str1, const string str2) {

    // Create a local array
    char buffer[strlen(str1.c_str) + strlen(str2.c_str) + 1];

    strcpy(buffer, str1.c_str);
    strcat(buffer, str2.c_str);

    // Store a pointer to the local array in a struct
    string ret = { buffer };

    return ret;
}

int main(int argc, char* argv[]) {

    string str1 = { "hello" };
    string str2 = { "goodbye" };
    string str3 = string_append(str1, str2);
}

执行str3后,string_append的内容是否有效?

3 个答案:

答案 0 :(得分:2)

函数返回后,buffer的内容未定义。如果你想在函数内部创建一些可以存在于函数外部的东西,你需要用malloc(或类似的东西)来分配它。

答案 1 :(得分:1)

好的,正如评论中所述,你不能这样做。但为什么

答案是你的代码

char buffer[strlen(str1.c_str) + strlen(str2.c_str) + 1];

正在分配自动存储,也就是说,它是作为堆栈的一部分创建的,它还包含函数的返回地址和参数。因此,当您从函数返回时,分配的空间可能会或可能不会在您尝试使用它时被破坏 - 但它可能会被破坏。

答案 2 :(得分:0)

您的buffer字符数组是在函数内创建的。在函数内创建的默认存储类变量是Automatic

这意味着,您的变量将作为堆栈的一部分创建。但是,当函数返回并且控制转到调用函数时,如果万一调用函数调用另一个函数,那么很快就会修改该堆栈。例如,如果您在printf()函数后调用string_append()。为printf()创建的堆栈将覆盖char *c_str pointer of string str3指向的位置。它会打印一些垃圾值。

试一试。