今天我教了几个朋友如何使用C structs.其中一个问你是否可以struct从一个函数返回一个函数,我回答说:"不!你会返回指向动态malloc编辑struct的指针."
来自主要使用C++的人,我期望无法struct按值返回s.在C++中,您可以operator =为对象重载并完全理解为具有按值返回对象的函数.但是,在C中,你没有那个选项,所以它让我思考编译器实际上在做什么.考虑以下:
struct MyObj{
double x, y;
};
struct MyObj foo(){
struct MyObj a;
a.x = 10;
a.y = 10;
return a;
}
int main () {
struct MyObj a;
a = foo(); // This DOES work
struct b = a; // This does not work
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我理解为什么struct b = a;不能工作 - 你不能operator =为你的数据类型重载.它是如何a = foo();编译罚款?这是否意味着什么struct b = …
gcc 4.4.4下面的简单代码段错误
#include<stdio.h>
typedef struct Foo Foo;
struct Foo {
char f[25];
};
Foo foo(){
Foo f = {"Hello, World!"};
return f;
}
int main(){
printf("%s\n", foo().f);
}
Run Code Online (Sandbox Code Playgroud)
将最后一行更改为
Foo f = foo(); printf("%s\n", f.f);
Run Code Online (Sandbox Code Playgroud)
工作良好.这两个版本在编译时都有效-std=c99.我只是调用未定义的行为,或者标准中的某些内容已更改,这允许代码在C99下工作?为什么在C89下崩溃?