所以我有以下代码并且它没有按照我的意愿工作。由于我不是使用结构的专家,我无法找到问题。
typedef struct foo {
int a;
int b;
int c;
} bar;
int function( bar *a ) {
int m[3] = {0};
//
//code filling m with values
//
if ( condition == true) {
a = (bar*)&m;
printf("%d", a->a);
status = SUCCESS;
}
//
//other code
//
return status;
}
int main() {
int ret=0;
bar a;
ret = function (&a);
if (ret == SUCCESS) {
printf(" %d ", a.a);
}
}
第一个printf(函数中的一个)输出正确的值。第二个不是。任何人都可以帮我吗?谢谢。
答案 0 :(得分:1)
使用赋值a =(bar *)& m,您可以更改函数的函数参数(a)指向的位置,而不是主函数中变量的内容。
主函数中的变量a完全没有意识到这一点,因此在函数调用之前保持未初始化状态。结果是你从堆栈输出随机的东西。
您可以使用memcpy来实现您想要的效果。
memcpy(a, &m[0], sizeof(bar));
答案 1 :(得分:0)
“不打印正确值”是什么意思?
bar
结构在堆栈上分配,因此其内容未初始化。因此,根据之前的堆栈状态,你获得的是完全随机的。
在第一种情况下,数组初始化为零,你也将得到零。但是,请注意它的平台依赖于结构元素如何映射到内存。