在为全局结构中的字段赋值后自由

时间:2016-12-08 10:31:21

标签: c scope free

这是我想要了解的小型C程序:

#include <stdio.h>
#include <stdlib.h>

typedef struct dm_user_params_t {
    int x;
} dm_user_params;

dm_user_params xx;

void set_user_params(dm_user_params *yy) {
    xx.x = yy->x;
}

int main() {
    dm_user_params xx;
    dm_user_params *yy;
    yy = malloc(sizeof(dm_user_params));
    yy->x = 217;
    set_user_params(yy);
    free(yy);
    printf("2 %d" , xx.x);
    return 0;
}

输出:

537340672

我应该怎么做,以便xx.x中的值应该保留?

当我xx.x = yy->x时,是否复制了引用而不是值?如何验证?

6 个答案:

答案 0 :(得分:1)

此问题与yyfree电话无关。

相反,它是因为你有两个独立变量名为xx。一个是set_user_params函数将使用的全局变量。另一个是printf函数将使用的 local 变量。局部变量尚未初始化,因此它的值将是 indeterminate

解决方法是 删除局部变量。 删除全局变量并将指向本地变量的指针作为set_user_params函数的额外参数传递。

答案 1 :(得分:1)

你的本地变量xx正在影响全局相同的声明(带有确切的类型和名称)

set_user_params更改了全局xx

修复1:删除局部变量。也:

void set_user_params(dm_user_params *yy) {
    xx.x = yy->x;
}

可写:

void set_user_params(const dm_user_params *yy) {
    xx = *yy;
}

因此,当您添加更多字段时,set_user_params不需要更新。

修复2:删除全局变量并按原样更改原型:

void set_user_params(dm_user_params *dest, const dm_user_params *src) {
    *dest= *src;
}

然后调用set_user_params(&xx,yy);

答案 2 :(得分:0)

此处的问题是,xx内的全局main()xx中的内部main()遮挡。

引用C11,章节§6.2.1,标识符范围,(强调我的

  

[...]如果标识符指定同名的两个不同实体   空间,范围可能重叠。如果是这样,一个实体(内部范围)的范围将结束   严格地在另一个实体的范围之前(外部范围)。 在内部范围内,   identifier指定在内部作用域中声明的实体;在外部宣布的实体   范围在内部范围内隐藏(并且不可见)。

所以,在你的情况下,

 printf("2 %d" , xx.x);

正在尝试访问未初始化的本地变量xx.x,并调用undefined behavior

解决方案:xx删除main()的本地变量定义。

答案 3 :(得分:0)

dm_user_params xx;

main()内,局部变量xx未初始化,而全局xx已初始化。您正在打印未初始化的值。

答案 4 :(得分:0)

删除

<welcome-file-list>
   <welcome-file>/Calculator.jsp</welcome-file>
</welcome-file-list>

在您的主要部分,它将工作。 您有两个变量dm_user_params xx; ,一个是本地变量,另一个是全局变量。您将函数xx中的全局值设置为217,但稍后在主体中打印本地的,未初始化并将导致未定义的行为。

答案 5 :(得分:0)

试试这个:

#include <stdio.h>
#include <stdlib.h>

typedef struct 
{
    int x;
} dm_user_params_t;

dm_user_params_t xx;

void set_user_params(dm_user_params_t *yy) 
{
    xx.x = yy->x;
    printf("Got : %d \n",yy->x);
}

int main(void) 
{
    // dm_user_params_t xx; Note: Local object getting highest priority than global, that's why you are getting garbage value
    dm_user_params_t *yy;
    yy = malloc(sizeof(dm_user_params_t));
    yy->x = 217;
    set_user_params(yy);
    free(yy);
    printf("2 %d" , xx.x);
    return 0;
}