C 装配框架重叠吗?
背景C 装配框架重叠吗?,c,gcc,C,Gcc,背景 typedef struct Result { int type; union { Err err; Table tbl; }; } Result; typedef struct Err { int status; String command; String err; } Err; Result *getres(...) { .... return &(Result) {....}; } void somefun(..)
typedef struct Result {
int type;
union {
Err err;
Table tbl;
};
} Result;
typedef struct Err {
int status;
String command;
String err;
} Err;
Result *getres(...) {
....
return &(Result) {....};
}
void somefun(..) {
...
Result *res = getres(..);
// (A)
handleres(res);
}
void handleres(Result *res) {
// (B)
...
}
(A) 在点A,res具有从getres传递的预期数据,但点(B)具有不同的数据,并且调试代码视图,使大多数res元素指针具有相同的res指针!!,不只是第一个元素,除了一个元素res->err->err
在装配意义上
getres返回指向eax中本地结果的指针,该指针映射到getres例程的span-start(ebp)到span-end(ebp)
问题
动态分配是可行的,但为什么静态定义的结构指针会这样,程序集框架会被使用并且-start(ebp)、-end(ebp)会被覆盖吗?没有任何程序集的程序集问题?是的,堆栈会被重用。您不应该返回指向局部变量的指针(如果您正这样做的话),因为这些指针将在函数末尾超出范围,内存可能会被重用。@Jester那么当静态定义的结构指针有用时?@Jester回答了这个问题,您可以写下第一个问题的详细答案来结束这个问题吗?关于第二条评论的任何见解都可能重复