64bit机器 C implicit-function-declaration 函数返回指针 地址值截断问题

昨天碰到了问题,32bit机器正常,但64bit机器crash,把问题简化了下

func_a.h

声明了mystruct * func_a( );

func_a.c定义了

mystruct * func_a( )

{

//mystruct * inner进行内存申请和赋值

//print  %p, inner-----address1 0x7ff87804b4a8

return inner;

}

func_b.c调用了func_a函数(但没有包含func_a的声明)

mystruct * pt_mst = func_a(); //打印pt_mst, 发现地址值非address1,0xffffffff7804b4a8,地址值被截断了

尝试改从函数参数使用二级指针返回,是正常的。

在stackoverflow上找到相同问题

http://stackoverflow.com/questions/23144151/64-bit-function-returns-32-bit-pointer

By default all return values are int. So if a prototype is missing for function then compiler treats the return value as 32-bit and

generates code for 32-bit return value. Thats when your upper 4 bytes gets truncated.

在编译log里面看到了 func_a函数的implicit-function-declaration警告,像这类警告常见,但是因为func_a的用法(返回指针)

和64bit机器触发了这个地雷。

良好的编程习惯,老生重谈,warning和编译error同样都需要处理,消除warnning才是良好的习惯。。。

时间: 2024-10-01 00:38:50

64bit机器 C implicit-function-declaration 函数返回指针 地址值截断问题的相关文章

PHP自定义函数返回多个值

PHP自定义函数只允许用return语句返回一个值,当return执行以后,整个函数的运行就会终止. 有时要求函数返回多个值时,用return是不可以把值一个接一个地输出的. return语句可以返回任何类型的变量,这就是使自定义函数返回多个值的关键. 代码:  <?php function results($string) {      $result = array();      $result[] = $string;//原字符串     $result[] = strtoupper($

从函数返回指针

C++ 从函数返回指针 C++ 指针 C++ 指针 在上一章中,我们已经了解了 C++ 中如何从函数返回数组,类似地,C++ 允许您从函数返回指针.为了做到这点,您必须声明一个返回指针的函数,如下所示: int * myFunction() { . . . } 另外,C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量. 现在,让我们来看下面的函数,它会生成 10 个随机数,并使用表示指针的数组名(即第一个数组元素的地址)来返回它们,具体如下: #include <i

程序员之---C语言细节22(函数返回指针注意事项&amp;lt;悬空指针&amp;gt;、查看进程能够分配的内存大小)

主要内容:函数返回指针注意事项<悬空指针>.查看进程能够分配的内存大小 #include <stdio.h> char * favorite_fruit() { static char fruit[] = "apple"; // 不加static的话这个函数还回的指针会悬空,由于在函数退出时fruit组数被销毁 // 加了static后fruit数组分配在数据段里,而不是堆栈中.生命期和程序一样长,函数退出时变量 // 依旧有效 return fruit; }

程序猿之---C语言细节22(函数返回指针注意事项&lt;悬空指针&gt;、查看进程可以分配的内存大小)

主要内容:函数返回指针注意事项<悬空指针>.查看进程可以分配的内存大小 #include <stdio.h> char * favorite_fruit() { static char fruit[] = "apple"; // 不加static的话这个函数还回的指针以及悬空,因为在函数退出时fruit组数被销毁 // 加了static后fruit数组分配在数据段里,而不是堆栈中,生命期和程序一样长,函数退出时变量 // 依然有效 return fruit; }

函数返回多个值(c/c++)

当我们在处理一个数组的时候常常会碰到这样的问题:输入一个数组,和数组的一个元素,返回该元素所在行数和列数.这样就需要返回多组两个值,且组数不定.上述类型的函数在c语言程序里面存在两个问题.第一,函数只能返回一个值(指针):第二,若以指针返回值,则不确定指针所指的内存大小.以下先分别解决这两个问题,之后综合考虑. 1返回多个值的函数 1.1采用指针参量记录值 不用函数的返回值,直接用指针来处理.在函数的输入项里加入一个指针,用来保存记录多个值.如下所示,a[N][M]为要处理的数组,s为要找的数,

C++从函数返回指针

C++ 允许您从函数返回指针.为了做到这点,必须声明一个返回指针的函数,如下所示: int * myFunction() { . . . } 另外,C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量. 现在,来看下面的函数,它会生成 10 个随机数,并使用表示指针的数组名(即第一个数组元素的地址)来返回它们,具体如下: #include <iostream> #include <ctime> using namespace std; // 要生成和返回

Android JNI编程(三)——C语言指针的初步认识、指针变量、互换两个数、函数返回多个值

目录(?)[+] 一.什么是指针? 简单来说: 指针就是内存地址      内存地址就是指针.来看个小案例 #include<stdio.h> #include<stdlib.h> /** 指针就是内存地址 内存地址就是指针 */ main() { //定义一个int类型的变量i,并且赋值为10 int i=10; //定义一个int类型的一级指针变量p int* p; //把i对应的地址给p变量 p=&i; //指针取值*p:把p变量地址对应的值取出来 printf(&q

这样strstr函数返回了NULL值也就是0,和1比较不相等

但是到这里,我们已经可以确认一件事就是so中的解密函数逻辑有一层防护就是判断当前调用so的应用包名是否为正确的视频包名,如果不是就不走正确的解密逻辑了.所以这里我们需要修改一下so指令,让这个判断无效.修改指令其实很简单,我们看到他通过判断strstr函数返回的NULL值,也就是对应 CMP R0,#0 指令值,然后后面有一个BEQ跳转指令,这里我们可以这么改,他不是和0判断吗?其实0就是NULL值,我们把他改成和1比较,这样strstr函数返回了NULL值也就是0,和1比较不相等.那就正确的逻

(C/C++函数返回多个值)

当我们在处理一个数组的时候常常会碰到这样的问题:输入一个数组,和数组的一个元素,返回该元素所在行数和列数.这样就需要返回多组两个值,且组数不定.上述类型的函数在c语言程序里面存在两个问题.第一,函数只能返回一个值(指针):第二,若以指针返回值,则不确定指针所指的内存大小.以下先分别解决这两个问题,之后综合考虑. 1返回多个值的函数 1.1采用指针参量记录值 不用函数的返回值,直接用指针来处理.在函数的输入项里加入一个指针,用来保存记录多个值.如下所示,a[N][M]为要处理的数组,s为要找的数,