我是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语言中的未定义行为。 这不是在示例代码中进行的,但事情正朝着这个方向发展; 指针可能正在准备进行类型惩罚。
考虑到int
和float
不一定具有相同的大小; 这不是唯一的考虑因素。 在这样的代码中:
int i = 42; /* now treat i as a float and modify it sneakily */ *((float *) &i) = 3.14; printf("i = %dn", i);
printf
的输出仍然可以是42.优化编译器可以将i
放入机器寄存器,而偷偷摸摸的赋值可以在作为i
的“后备存储”的内存位置上执行,因此i
看起来没有变化,因为printf
调用使用register-cached副本。 编译器不需要考虑对float
类型指定的对象的修改可能会影响i
类型对象的值(即使它们具有相同的大小,因此赋值不会产生附带损害,例如覆盖其他对象)。
在现实世界中,有时需要编写一个操作浮点对象的代码,就像它们是整数一样:通常是unsigned int
整数,以获得对float
的按位表示的访问。 完成此操作后,您必须使用联合,或者可能使用特定于编译器的function,例如GCC的-fno-strict-aliasing
选项,这会导致编译器在类型惩罚时更加谨慎地进行优化。 在这种代码中,您确保所有假设都是关于类型大小的保证,使用#ifdef
-s用于不同平台,可能基于从运行配置脚本中检测到的值来检测平台function。
不用说,这不是一个在初学者级别学习C的好方法。
以上就是c/c++开发分享用C语言指点指针相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/519347.html