在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
的内容是否有效?
答案 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
指向的位置。它会打印一些垃圾值。
试一试。