热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C语言直接调用未声明的函数

问题描述:C语言直接调用未声明的函数的坑,跟之前的一篇直接malloc返回值的错误有点像。现象下面的函数调用,返回值的指针访问不了&#

问题描述:

C语言直接调用未声明的函数的坑,跟之前的一篇直接malloc返回值的错误有点像。

现象下面的函数调用,返回值的指针访问不了:

main.c

TestMalloc * test = FuncTest();printf("%d",test);

 Test.h

typedef struct __TestMalloc
{int a;char b;
}TestMalloc;

test.c


TestMalloc * FuncTest()
{TestMalloc * rnt = (TestMalloc *)malloc(sizeof(TestMalloc));memset(rnt,0, sizeof(TestMalloc));printf("%d", rnt);return rnt;
}

 打印分配的指针与返回的指针都是有效的,那么为啥就是外层的指针访问就崩溃呢。

问题分析:

再vs中会有一个警告:

warning C4047: “初始化”:“TestMalloc *”与“int”的间接级别不同

c4047一般是两个指针不匹配。怎么会不匹配呢?为题就处在这儿

再linux中的警告:

初始化时将整数赋给指针,未作类型转换 [默认启用]

再linux上直接在内外打印指针,两边的指针位数不一致。再vs直接访问不了内存。

问题原因:

如果我们使用函数没有前项声明或者在头文件里声明,c语言默认隐式声明。

~ps,请养成使用前声明的好习惯,少给自己和别人挖坑。

C98的描述
If the expression that precedes the parenthesized argument list in
a function call consists solely of an identifier, and if no
declaration is visible for this identifier, the identifier is
implicitly declared exactly as if, in the innermost block containing
the function call, the declarationextern int identifier();如果表达式在括号参数列表之前函数调用仅包含一个标识符,如果没有该标识符可见声明,
该标识符为在包含以下内容的最里面的块中完全隐式声明
函数调用,声明extern int identifier();

也就是说不管这个函数是什么样,只要返回值不是int,不声明就会有问题。导致返回值就是int值,如果int溢出,导致返回的指针或者其他数据类型出错。

问题解决方法:

无他,请声明


推荐阅读
  • 本文详细介绍如何在SSM(Spring + Spring MVC + MyBatis)框架中实现分页功能。包括分页的基本概念、数据准备、前端分页栏的设计与实现、后端分页逻辑的编写以及最终的测试步骤。 ... [详细]
  • linux网络子系统分析(二)—— 协议栈分层框架的建立
    目录一、综述二、INET的初始化2.1INET接口注册2.2抽象实体的建立2.3代码细节分析2.3.1socket参数三、其他协议3.1PF_PACKET3.2P ... [详细]
  • 深入解析C语言中的关键字及其分类
    本文将全面介绍C语言中的关键字,并按照功能将其分为数据类型关键字、控制结构关键字、存储类别关键字和其他关键字四大类,旨在帮助读者更好地理解和运用这些基本元素。C语言中共有32个关键字。 ... [详细]
  • 函子(Functor)是函数式编程中的一个重要概念,它不仅是一个特殊的容器,还提供了一种优雅的方式来处理值和函数。本文将详细介绍函子的基本概念及其在函数式编程中的应用,包括如何通过函子控制副作用、处理异常以及进行异步操作。 ... [详细]
  • 本文详细介绍了Oracle 11g中的创建表空间的方法,以及如何设置客户端和服务端的基本配置,包括用户管理、环境变量配置等。 ... [详细]
  • spring boot使用jetty无法启动 ... [详细]
  • 入门指南:使用FastRPC技术连接Qualcomm Hexagon DSP
    本文旨在为初学者提供关于如何使用FastRPC技术连接Qualcomm Hexagon DSP的基础知识。FastRPC技术允许开发者在本地客户端实现远程调用,从而简化Hexagon DSP的开发和调试过程。 ... [详细]
  • c语言二元插值,二维线性插值c语言
    c语言二元插值,二维线性插值c语言 ... [详细]
  • 本文分享了作者在使用LaTeX过程中的几点心得,涵盖了从文档编辑、代码高亮、图形绘制到3D模型展示等多个方面的内容。适合希望深入了解LaTeX高级功能的用户。 ... [详细]
  • 本文探讨了互联网服务提供商(ISP)如何可能篡改或插入用户请求的数据流,并提供了有效的技术手段来防止此类劫持行为,确保网络环境的安全与纯净。 ... [详细]
  • 利用Node.js实现PSD文件的高效切图
    本文介绍了如何通过Node.js及其psd2json模块,快速实现PSD文件的自动化切图过程,以适应项目中频繁的界面更新需求。此方法不仅提高了工作效率,还简化了从设计稿到实际应用的转换流程。 ... [详细]
  • 本文详细介绍了Linux系统中信号量的相关函数,包括sem_init、sem_wait、sem_post和sem_destroy,解释了它们的功能和使用方法,并提供了示例代码。 ... [详细]
  • 本文详细介绍了在 CentOS 系统中如何创建和管理 SWAP 分区,包括临时创建交换文件、永久性增加交换空间的方法,以及如何手动释放内存缓存。 ... [详细]
  • 长期从事ABAP开发工作的专业人士,在面对行业新趋势时,往往需要重新审视自己的发展方向。本文探讨了几位资深专家对ABAP未来走向的看法,以及开发者应如何调整技能以适应新的技术环境。 ... [详细]
  • 本文详细介绍了 `org.apache.tinkerpop.gremlin.structure.VertexProperty` 类中的 `key()` 方法,并提供了多个实际应用的代码示例。通过这些示例,读者可以更好地理解该方法在图数据库操作中的具体用途。 ... [详细]
author-avatar
青春脸001
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有