`
zsxxsz
  • 浏览: 444470 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

小谈C语言中常见数据类型在32及64位机上的使用

阅读更多

1、概述

  C语言有一些非常基本的数据类型,正是这些基本类型让我们可以延伸了无限的用户自定义类型,本文主要介绍了 int, size_t, time_t, long, long long int 等基本数据类型在Linux32 及 Linux64 的使用情况。表面看上去,这些类型确实太基础太简单,似乎没啥可讲的,实事似乎也是如此,用过C的对这些都已经非常熟悉了,这还用讲?在PC 64位机器出来之前,我们确实不用太关注这些,因为在32位机上编程,似乎很少出现过什么问题,但64位机出来了,象Linux 也支持64位机器,问题就来了,为什么?因为它们的长度发生了变化,而我们的程序也就有可能需要改变一下。

2、举例

先举个例子,如下:

 

#include <stdio.h>
#include <stdlib.h>

static void get_length(size_t *size)
{
    if (size)
        *size = 100;
}

static void test(void)
{
    char *buf = strdup("hello world");
    int  n;

    printf("buf: %s\n", buf);
    get_length((size_t*) &n);

    printf("buf: %s, n: %d\n",  buf, n);
    free(buf);
}

int main(int argc, char *argv[])
{
    test();
    return (0);
}

 

  首先将此程序在32位机的 Linux 上运行一下,如下:

buf: hello world

buf: hello world, n: 100

OK,如我们所料,一切正常。

 

  然后再将些程序在64位机的 Linux 上运行一下,如下:

buf: hello world

buf: (null), n: 100

  奇怪的现象出来了,怎么printf出的结果为空呢?晕菜,为啥经过 get_length()/1 后世界改变了,buf 的内容没有了,被指向一个空指针,而 buf 明明是还没有被释放呀。赶快用 valgrind 检查一下,

valgrind --tool=memcheck --leak-check=yes --show-reachable=yes ./a.out

“2 bytes in 1 blocks are definitely lost in loss record 1 of 1”,说有块内存未被释放,而在 test() 后面确实释放过 buf 呀,谁偷偷地给释放了而没有告诉俺?更晕菜,难道是 libc 的问题?再用 valgrind 在32位机检查一下,一切OK,没有出现64位机上的错误提示,说明内存确实由 test() 中的 free(buf) 释放了。

  正当对此问题百思不解时,忽然想到一个问题 int * 至 size_t*  类型转换会不会有问题?因为 size_t 在32位机上是4字节,而在64位机上是8字节,int在32位及64位机上都是4字节,嗯,问题就在于此,再回头仔细看看上述代码,在 test() 中将 &n 由 int * 强制转换成 size_t *, 这样可以避免编译警告,但在 get_length()/1 中呢?它是不会知道 size_t *size 中 size 所指空间是4字节的,而依然当8字节对待,这样在对 *size = 100 进行赋值时就发生了改变,size 所指的8字节空间发生改变,而实际应该只改变4字节才是,这便是问题的关键所在,所以在遇到此类问题时,一定得要注意基本类型在不同机器上的空间大小了。

 

3、小结

  以上的例子只是一个简单的例子,也许还容易看得出来,当我们的项目比较大时,这种错误可能会偶尔发生一下,那可能就是致命的了,因为有时它并不会导致程序 异常退出产生core文件,但却会改变我们的运行结果,本人就因此问题调试了两天多的时间才找到原因,另外,即使因此问题产生了 core 文件,你会发现用 gdb 调试该 core 时根本找不到原因所在。

 

下面列出一些基本类型在32位及64位机上的大小差异

int long size_t time_t long long int
32位机器 4字节 4字节 4字节 4字节 8字节
64位机器 4字节 8字节 8字节 8字节 8字节

 

在写跨平台的程序时,一定要注意这些基本类型的长度大小。

 

个人微博:http://weibo.com/zsxxsz

 

2
0
分享到:
评论
1 楼 sunzihao128858 2014-09-26  
老大的,呵呵。再读一遍。

相关推荐

    C语言FAQ 常见问题列表

    o 2.2 64 位机上的 64 位类型是什么样的? o 2.3 怎样定义和声明全局变量和函数最好? o 2.4 extern 在函数声明中是什么意思? o 2.5 关键字 auto 到底有什么用途? o 2.6 我似乎不能成功定义一个链表。我试过 ...

    C语言常见问题集 原著:Steve Summit

    2.2 64 位机上的 64 位类型是什么样的? 2.3 怎样定义和声明全局变量和函数最好? 2.4 extern 在函数声明中是什么意思? 2.5 关键字 auto 到底有什么用途? 2.6 我似乎不能成功定义一个链表。我试过 typedef ...

    程序设计入门—C语言(完)-浙江大学-翁恺 视频.txt

    C语言是古老而长青的编程语言,它具备了现代程序设计的基础要求,它的语法是很多其他编程语言的基础,在系统程序、嵌入式系统等领域依然是无可替代的编程语言,在各类编程语言排行榜上常年占据前两名的位置。...

    试论C语言在高校计算机专业课程中的意义.doc

    试论C语言在高校计算机专业课程中的意义 ...c语言在计算机科技领域中的应用优势主要包含以 下几个方面: 3.1 c语言强大的功能优势和良好的使用性能 c语言丰富完备的数据结构设计,能够较为灵活的对数据流进行控制,同时

    c语言编写单片机技巧

    答:对于复杂而开发时间紧的项目时,可以采用C语言,但前提是要求对该MCU系统的C语言和C编译器非常熟悉,特别要注意该C编译系统所能支持的数据类型和算法。虽然C语言是最普遍的一种高级语言,但不同的MCU厂家其...

    华为编程开发规范与案例

    近日在CDB并行测试中发现一个问题:我们需要的小区负荷话统结果总是为零,开始还以为小区负荷太小,于是加大短消息下发数量,但还为零,于是在程序中加入测试代码,把收到的数据在BAM上打印出来, 结果打印出来的...

    《iPhone开发实战》.(Christopher Allen).pdf

    11.4.2 在xcode中使用其他模板157 11.4.3 xcode提示和技巧158 11.5 小结159 第12章 使用interface builder160 12.1 interface builder介绍160 12.1.1 interface builder剖析160 12.1.2 在interface ...

    会计理论考试题

    14.在Windows98中,如果删除了软盘上的文件,则该文件在Windows98中___A____。 A、不可恢复 B、可以在“回收站”中找到 C、可以恢复 D、可以在“我的公文包”中找到 15.下列软件中不属于系统软件的是 ___D__ 。 A、...

    JAVA面试题最全集

    1.Java有那些基本数据类型,String是不是基本数据类型,他们有何区别。 2.字符串的操作: 写一个方法,实现字符串的反转,如:输入abc,输出cba 写一个方法,实现字符串的替换,如:输入bbbwlirbbb,输出...

    Firebird数据库中文版

    Firebrid在常见的平台上都可运行,如Linux和Windows(包括Windows终端服务器)其它支持的平台包括(MAC OS(苹果机), Solaris及HP-UX) 把数据库从一个平台转到另一个平台,非常的容易,只要备份数据库,然后,再...

    Android持久化存储(3)SQLite数据库的使用

    SQLite是由C语言编写的一款轻型数据库,因占用资源小,处理速度快,功能齐全,特别适用于移动设备,最重要的是开源,任何人都可以使用它,许多开源项目(PHP,Python)和当今两大手机操作系统Android和iOS都使用了...

    基于单片机的时钟设计(1).doc

    由于之前没有独立做过单片机实现多功能电子 时钟方面的内容,所以在做设计时总会遇见很多问题,本次设计是在结合老师的指导及 同学的帮助下完成的,并通过在网上所查的大量资料及单片机设计中常见的电路而构思 出来...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    她是Oracle ACE,也是OakTable(Oracle社区中著名的“Oracle科学家”的非正式组织)的成员,经常在技术会议上演讲。她的著作还包括 Expert Oracle Practices和Beginning Oracle SQL,博客主页是karenmorton....

    电子设计大赛——单主控MCU的选择.doc

    来的,很多地方就是用线连在万能焊接板上,如果性能不可靠将会出现晶振不起振,数据线 长了传送的数据就不对,而且容易被静电打坏,这些都将直接影响你的比赛进度,有些单片 机速度慢,数据处理能力差,也会影响到赛场的发挥...

    AIX基础PPT

    内核提供以下功能 ● 多用户、多进程的调度● I/O设备的接口● 管理磁盘上的文件● AIX内核主要用C语言编写、少量用汇编语言 文件系统 AIX提供三种类型的文件,普通文件,设备文件和命令文件 Shell ● 是系统于...

    C/C++程序员面试指南.杨国祥(带详细书签).pdf

    问题十四:“你希望与什么样的上级共事?” 问题十五:“你在前一家公司的离职原因是什么?” 1.4 为明天做好计划 第2章 英文面试 2.1 英文电话面试 2.1.1 英文电话面试注意事项 2.1.2 英文电话面试常见 问题 问题...

    软件工程-理论与实践(许家珆)习题答案

    SA法是面向数据流,建立在数据封闭原则上的需求分析方法。(√) 3. HIPO法既是需求分析方法,又是软件设计方法。(√) 4. 在面向对象的需求分析方法中,建立动态模型是最主要的任务。(×) 5. 加工小说明是对系统...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    Mysql 甲骨文 是个开源的数据库server,可运行在多种平台, 特点是响应速度特别快,主要面向中小企业 中小型企业 PostgreSQL 号称“世界上最先进的开源数据库“,可以运行在多种平台下,是tb级数据库,而且性能也很...

Global site tag (gtag.js) - Google Analytics