float number = 1.0;
float* number_pointer = &number;
int* int_pointer = (int*) number_pointer;
*int_pointer += 30;
printf("%f \n",number);
(*int_pointer)+= 30;
行在这里做了什么?
答案 0 :(得分:1)
我在那里看到两个问题。
使用
时会发生什么int* int_pointer = (int*) number_pointer;
该行获取包含float
的对象的地址,并将该地址存储在int_pointer
中。此时,编译器将能够将地址视为包含整数。这违反了strict aliasing rule。
使用
时会发生什么*int_pointer += 30;
它会增加int_pointer
指向30
的对象的值。如果int_pointer
指向有效的int
对象,则该操作将没有问题。在您的情况下,这将导致未定义的行为,因为int_pointer
确实指向float
类型的对象。
答案 1 :(得分:0)
让我解释一下每个陈述:
float number = 1.0;
在这里,您声明并初始化了一个名为number
的浮点变量。
float* number_pointer = &number;
声明并初始化浮点类型指针number_pointer
到number
。这意味着number_pointer
包含变量number
的地址,*number_pointer
包含变量number
的值,即1.0
。
int* int_pointer = (int*) number_pointer;
类型转换浮点指针number_pointer
到整数指针并初始化为int_pointer
。在此显式类型转换后,*int_pointer
的值不是1.0
,而是其对应的整数1065353216
。
*int_pointer += 30;
这是*int_pointer = *int_pointer + 30;
的简写。 *int_pointer
变为1065353246
。
printf("%f \n",number);
打印number
的值,现在为1.000004
而非初始1.000000
。更改是由int_pointer
上执行的添加引起的,该添加指向number_pointer
指向的位置,而number
指向变量drop table if exists temp_a;
create temp table temp_a
(
"QUERY PLAN" text
);
DO
$$
DECLARE
rec record;
BEGIN
FOR rec IN EXECUTE 'EXPLAIN VERBOSE select version()'
LOOP
-- RAISE NOTICE 'rec=%', row_to_json(rec);
insert into temp_a
select rec."QUERY PLAN";
END LOOP;
END
$$ language plpgsql;
select *
from temp_a;
。