引用和解除引用结构的问题

时间:2017-01-03 03:17:46

标签: c function pointers structure

所以我有以下代码并且它没有按照我的意愿工作。由于我不是使用结构的专家,我无法找到问题。

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(函数中的一个)输出正确的值。第二个不是。任何人都可以帮我吗?谢谢。

2 个答案:

答案 0 :(得分:1)

使用赋值a =(bar *)& m,您可以更改函数的函数参数(a)指向的位置,而不是主函数中变量的内容。

主函数中的变量a完全没有意识到这一点,因此在函数调用之前保持未初始化状态。结果是你从堆栈输出随机的东西。

您可以使用memcpy来实现您想要的效果。

memcpy(a, &m[0], sizeof(bar));

答案 1 :(得分:0)

“不打印正确值”是什么意思?

bar结构在堆栈上分配,因此其内容未初始化。因此,根据之前的堆栈状态,你获得的是完全随机的。

在第一种情况下,数组初始化为零,你也将得到零。但是,请注意它的平台依赖于结构元素如何映射到内存。