这是我想要了解的小型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
时,是否复制了引用而不是值?如何验证?
答案 0 :(得分:1)
此问题与yy
或free
电话无关。
相反,它是因为你有两个独立变量名为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;
}