Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在C中内嵌函数声明是否实际生成对象代码?

在C中内嵌函数声明是否实际生成对象代码?
EN

Stack Overflow用户
提问于 2009-10-14 05:05:28
回答 3查看 307关注 0票数 1

在讨论malloc的过程中,许多人声称malloc的隐式声明会导致返回值被转换为int,然后再转换回T*,可能会导致指针在以下情况下被截断:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sizeof(int) < sizeof(void*)

这将意味着编译器执行以下操作:

  1. 链接并调用定义malloc的正确目标代码
  2. 生成对象代码,以将返回值转换为较短的int类型。
  3. 生成对象代码,以将其转换回更大的目标指针类型。

真的有人能证明这事发生了吗?比如在64位Linux上使用一些示例代码?

我会自己做的,但我没有64位机器的权限。

EN

回答 3

Stack Overflow用户

发布于 2009-10-14 05:20:02

Malloc是在stdlib.h文件头中声明的,声明由源代码的C预处理器直接包含,然后在以后的阶段与malloc代码链接。

当您有代码时:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdlib.h>
...
void * foo = malloc(42);

它实际上被加工成类似于

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
extern void *malloc (size_t __size) __attribute__ ((__nothrow__)) __attribute__ ((__malloc__)) ;
(...lots of other declarations...)
...
void * foo = malloc(42);

当您不包括函数原型时,它默认为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int malloc();
...
void * foo = malloc(42);

这意味着最终编译的代码将执行类似的操作,“使用参数42调用malloc,将其返回值从int转换为void*,并将其转换为foo”。然后,它将与带有malloc预编译对象代码的libc链接,这显然是无效的*-返回。因此,结果将是在保存返回值的CPU寄存器上进行一次额外的int*转换。我设想在64位架构上,它可能意味着接受较低的32位,并在前面放置32个零,从而清除部分原始指针。

票数 1
EN

Stack Overflow用户

发布于 2009-10-14 05:28:31

我认为2并不像你所暗示的那样是一种“宝贵”的转换。当使用返回类型未知的函数进行数据处理时,编译器必须对要“获取”的字节数做出一些假设。默认值是int的大小。

所以,如果一个空*和一个int恰好是相同的大小,那么,好的,如果不是oops!

票数 1
EN

Stack Overflow用户

发布于 2009-10-14 06:01:05

通过省略malloc的声明(prototype),编译器假定它返回int。因此,对它的调用作为代码生成,以调用返回int结果的函数。

根据系统的不同,这样做的方式不同,因此结果可能会在数据寄存器、地址寄存器或堆栈中被传回。

然后,编译器生成额外的代码,以将(推定的)返回的int值转换为指针。

很明显,这不是你想要的。在大多数系统上,您可能会很幸运,因为在这些系统中,ints和指针的宽度是相同的,因此返回值的转换基本上没有任何作用,但是不能依赖这种行为。

总之,--不声明外部函数是一件坏事。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1566107

复制
相关文章
原 CentOS(亚马逊EC2,亚马逊班)
一、安装 nginx 今天早上看到新闻,nginx正式发布1.10稳定版,所以就不用系统内带的1.8的稳定版了,所以自己编译安装下。 1、下载 访问:http://nginx.org/ 找到最新版:http://nginx.org/en/download.html 下载最新版: wget http://nginx.org/download/nginx-1.10.0.tar.gz 下载后解压: tar -zxf nginx-1.10.0.tar.gz cd nginx-1.10.0 2、安装编译支持依赖模块
霡霂
2018/06/04
7830
certbot开启亚马逊EC2主机https
国内那么多云主机运营商, 你为何要买国外的主机呢, 你肯定在干些见不得人的勾当..
chuchur
2022/10/25
5080
原 亚马逊云EC2启用密码登陆
亚马逊的云服务器在创建的时候会让你选择一个秘钥,然后让你下载一个私钥,通过私钥连接,禁用root和密码登陆,这样十分安全,但是在管理也存在不方便的地方。 这篇文章就简单的介绍下,开启root权限和启用密码登陆。 一、启用root账号 为root设置密码 sudo passwd root 二、允许密码登陆 1、切换到root权限 su root 2、修改ssh配置文件,允许密码登陆 vim /etc/ssh/sshd_config 修改配置文件 ## 将下面的 no 改为 yes 可使用/搜索 Pass
霡霂
2018/06/04
1.7K0
Amazon EC2 虚拟化技术演进:从 Xen 到 Nitro
今年2月,由光环新网运营的AWS 中国(北京)区域和由西云数据运营的 AWS 中国(宁夏)区域发布新的实例类型,新的实例类型包括C5、C5d、R5、R5d。除了这四种之外,在AWS国外部分区域还上线了最新的C5n。
SammyLiu
2019/06/28
7K0
Amazon EC2 虚拟化技术演进:从 Xen 到 Nitro
手把手在亚马逊EC2上搭建Keras GPU
由于需要使用越来越复杂的神经网络,我们还需要更好的硬件。但我们的电脑通常不能承受那么大的网络,不过你可以相对容易地在亚马逊上租用一个功能强大的计算机,比如E2服务你可以相对容易地按照小时租用在亚马逊EC2服务。 我使用Keras——一个开源神经网络Python库。因为它的易用性,所以初学者可以很容易开始自己的深度学习旅程。它建立在TensorFlow之上(但是Theano也可以使用)—— 一个用于数值计算的开源软件库。租借的机器将通过浏览器使用Jupyter Notebook ——一个网络应用程序,允许共享
GPUS Lady
2018/04/02
2K0
手把手在亚马逊EC2上搭建Keras GPU
如何将ownCloud转换为Nextcloud
ownCloud的核心开发团队中一部分人员启动了一个名为Nextcloud的项目。虽然ownCloud将继续开发,但您可能想了解新项目的功能。Nextcloud和ownCloud共享一个公共代码库,这意味着将现有的ownCloud安装迁移到Nextcloud中。
小铁匠米兰的v
2018/08/02
2.6K0
如何将Array转换为List?
可以使用 Arrays.asList() 方法, 该方法接受一个数组作为输入,并返回一个列表作为输出。
程序你好
2018/07/23
1.4K0
java如何将String转换为enum
已知枚举对应的String值,希望得到对应的枚举值。例如,已知"A",希望得到对应的枚举——Blah.A,应该怎么做? Enum.valueOf()是否能实现以上目的,如果是,那我如何使用?
硬核编程
2020/07/23
3.9K0
AkShare-期货数据-期转现
期货转现货,简称期转现。期转现是指持有同一交割月份合约的多空双方之间达成现货买卖协议后,变期货仓位为现货仓位的交易。期转现方法是:达成协议的双方共同向交易所提出申请,获得交易所批准后,分别将各自持仓按双方商定的平仓价格由交易所代为平仓(现货的买方在期货市场须持有多头仓位,现货的卖方在期货市场须持有空头仓位)。同时双方按达成的现货买卖协议进行与期货合约标的物种类相同、数量相当的现货交换。
数据科学实战
2021/02/05
4320
AkShare-期货数据-期转现
如何将视频轻松转换为 GIF
有时看到一条有意思的视频想发到朋友圈,但朋友圈有限制时长,而且也不方便,这时可以把视频转GIF(再做成表情包也可以),再发到朋友圈或者微博(不用像视频一样需要等待审核)。
苏生不惑
2020/02/26
1.8K0
如何将pdf转换为word 2.0
再次以《新冠肺炎诊疗方案(试行第七版)》为例,该文件为图片性pdf,文字不可复制。
生信菜鸟团
2020/06/04
2.6K0
Java 如何将 List 转换为 MAP
上面的代码将会把 Id 作为 Key,然后生成的 Map 是以 id 为 Key,Animal 为Value 的 Map。
HoneyMoose
2022/10/12
2K0
Java 如何将 List 转换为 MAP
如何将pdf转换为word 3.0
相对于封装的软件,python和R的操作需要稍微折腾一下。浏览论坛的时候的发现了一款轻量级程序,尝试了一下还不错,看一下转换的效果:
生信菜鸟团
2020/08/04
1.7K0
如何将pdf转换为word 3.0
java如何将String转换为Int
Short.valueOf/parseShort, Long.valueOf/parseLong等也是有类似差别。
硬核编程
2020/07/23
1.6K0
如何将 JSON 转换为有序判断?
JSON(JavaScript Object Notation)是系统之间数据交换的流行格式。它是一种轻量级、基于文本且易于解析的格式,已成为互联网上数据交换的标准。但是,JSON 不会为数据结构中的元素提供任何顺序。虽然这在大多数情况下可能不是问题,但在某些情况下,元素的顺序很重要。
很酷的站长
2023/08/11
4100
如何将 JSON 转换为有序判断?
[1154]如何将字符串转换为datetime
1.把datetime转成字符串: 2017-11-23 17:05:18 2.把字符串转成datetime: 2017-11-23 16:10:10 3.把字符串转成时间戳形式: 1511424610.0 4.把时间戳转成字符串形式: 2017-11-23 17:05:18 5.把datetime类型转外时间戳形式: 1511427918.0
周小董
2022/07/27
3.3K0
mysql整型转字符串_java中如何将字符串转换为字符数组
select * from A order by cast(name as unsigned);
全栈程序员站长
2022/09/27
23.3K0
java中如何将数组转换为List
如何将其转换为ArrayList <Element> arraylist = ???
硬核编程
2020/07/23
3.1K0
如何将文字转换为对应的PathGeometry
其实我们可以使用FormattedText的BuildGeometry将字符串转成对应的Geometry
黄腾霄
2020/06/10
1.6K0
亚马逊AWS自研芯片深度分析
去年的AWS re:Invent 2021有很多跟芯片相关的内容值得展开来说的事情。但网上已经有很多专业的文章了,我就不再班门弄斧一一介绍了。
chaobowx
2022/12/16
9990
亚马逊AWS自研芯片深度分析

相似问题

如何确保xen DomU是HVM或PV

31

将amazon实例从PV转换为HVM的最简单方法

14

AWS:将t1.微(PV)转换为t2.介质(HVM)

11

如何知道HVM和PV支持哪种类型的实例?

20

亚马逊网络服务ElasticBeanstalk EC2出现postgresql连接错误

211
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文