【发布时间】:2015-02-11 09:36:57
【问题描述】:
我想看看你是否可以通过堆栈传递结构,并且我设法从另一个 void 函数中的 void 函数获取本地 var。
你们认为这有什么用吗?有没有可能在两个函数调用之间获得损坏的数据?
这是 C 中的代码(我知道它很脏)
#include <stdio.h>
typedef struct pouet
{
int a,b,c;
char d;
char * e;
}Pouet;
void test1()
{
Pouet p1;
p1.a = 1;
p1.b = 2;
p1.c = 3;
p1.d = 'a';
p1.e = "1234567890";
printf("Declared struct : %d %d %d %c \'%s\'\n", p1.a, p1.b, p1.c, p1.d, p1.e);
}
void test2()
{
Pouet p2;
printf("Element of struct undeclared : %d %d %d %c \'%s\'\n", p2.a, p2.b, p2.c, p2.d, p2.e);
p2.a++;
}
int main()
{
test1();
test2();
test2();
return 0;
}
输出是:
声明的结构:1 2 3 a '1234567890'
结构元素未声明:1 2 3 a '1234567890'
结构元素未声明:2 2 3 a '1234567890'
【问题讨论】:
-
我忘了说:它之所以有效,是因为在 C 中,当您在堆栈中声明一个新变量时,它不会将值初始化为 0 或 NULL,因此取的值就是其中的值堆栈:在这种情况下是 p1 的值。
-
有些人会认为这是一个糟糕的主意。它过于依赖未出现在 C 标准中的实现细节。
-
尝试在
Pouet p2;上方添加类似char dummy[16];的内容,看看它是否仍能按预期工作。 -
没有段错误,如果你在 test2() 的末尾和 Pouet p2 之间触摸堆栈;它不起作用。我真的不认为你可以在真正的程序中使用它,但它是一个很酷的 hack imo