用C语言指点指针

我是C的新手,我正在编写一个非常基本的函数,它将整数指针作为参数。 在函数内部,必须创建一个浮点指针。 此函数必须将整数指针的值赋给float,然后返回float。 这是我目前的代码:

float * function(const int *x) { float *p = (float*)x; return p; } 

但是这会导致在运行时读取的错误:“free():无效指针:0x00007fffc0e6b734”。 我只想说,我很困惑。 您可以提供的任何见解将非常感谢!

作为C的新手,您是否熟悉变量的范围 ? (部分)变量作用域的简短版本是,如果你不做一些额外的东西,在函数中创建的变量只存在于该函数内。 为什么这对你很重要:如果你返回一个指向你在函数内部创建的变量的指针(没有做那么多额外的事情),那么指针将指向一个可能包含或不包含你赋给它的值的内存区域。 做你想做的事的一种方法是:

 float *makefloat(int *x) { // static keyword tells C to keep this variable after function exits static float f; // the next statement working from right to left does the following // get value of pointer to int (x) by dereferencing: *x // change that int value to a float with a cast: (float) // assign that value to the static float we created: f = f = (float) *x; // make pointer to float from static variable: &f return &f; } 

一般来说,我似乎看到更多函数接受指向要修改的变量的指针,然后在该函数中创建新值并将其分配给指针引用的内存区域。 因为该内存区域存在于函数范围之外,所以不必担心范围和静态变量。 关于静态变量的另一个很酷的事情是,下次调用该函数时,静态变量具有与函数上次退出时相同的值。 在维基百科上解释。

*&良好解释: C中的指针:何时使用&符号和星号

您的函数仅执行指针转换。 表单的函数调用

 q = function(p); /* p is a "const int *" pointer, q is assignment comaptible with "float *". */ 

可以用表达式替换:

 q = (float *) p; 

就其本身而言,这不会造成任何伤害。 问题出在您的计划的其他地方。

请注意,大多数类型处罚,如使用float类型的表达式通过指针访问int类型的对象,是C语言中的未定义行为。 这不是在示例代码中进行的,但事情正朝着这个方向发展; 指针可能正在准备进行类型惩罚。

考虑到intfloat不一定具有相同的大小; 这不是唯一的考虑因素。 在这样的代码中:

 int i = 42; /* now treat i as a float and modify it sneakily */ *((float *) &i) = 3.14; printf("i = %d\n", i); 

printf的输出仍然可以是42.优化编译器可以将i放入机器寄存器,而偷偷摸摸的赋值可以在作为i的“后备存储”的内存位置上执行,因此i看起来没有变化,因为printf调用使用register-cached副本。 编译器不需要考虑对float类型指定的对象的修改可能会影响i类型对象的值(即使它们具有相同的大小,因此赋值不会产生附带损害,例如覆盖其他对象)。

在现实世界中,有时需要编写一个操作浮点对象的代码,就像它们是整数一样:通常是unsigned int整数,以获得对float的按位表示的访问。 完成此操作后,您必须使用联合,或者可能使用特定于编译器的function,例如GCC的-fno-strict-aliasing选项,这会导致编译器在类型惩罚时更加谨慎地进行优化。 在这种代码中,您确保所有假设都是关于类型大小的保证,使用#ifdef -s用于不同平台,可能基于从运行配置脚本中检测到的值来检测平台function。

不用说,这不是一个在初学者级别学习C的好方法。