小谈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位机上的大小差异

intlongsize_ttime_tlong long int
32位机器4字节4字节4字节4字节8字节
64位机器4字节8字节8字节8字节8字节

 

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

 

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
试论C语言在高校计算机专业课程的意义 摘要:c语言是高校计算机相关专业的基础课程之一,是计算机专业学生必须具备的 基本技能之一。c语言功能强大、应用广泛,在计算机相关科技领域不断发展,渐趋完 善。本文旨在概述c语言特性特点的同时,结合我国高校计算机专业教学态势,进一步分 析c语言在高校计算机专业课程的地位和作用。 关键词:c语言;基础语言;计算机专业 图分类号:tp312.1-4 文献标识码:a 文章编号:1007-9599 (2012) 17- 0000-02 c语言是目前高校计算机专业课程广泛应用于教学的计算机高级语言,一直以来被作为 计算机专业的基础课程,在一些非计算机专业的教学也是一门重要基础学科。c语言广 泛应用于计算机的各个领域,包括计算机数据分析和管理、图像图形处理、操作程序和 系统、软件程序设计等等。c语言作为计算机专业的基础语言,具有优点多、应用广、通 用性强、可植性强、效率高等特点,这决定了它广阔的应用领域和持久的生命力。 1 c语言在计算机应用领域的应用特点 c语言是进行计算机程序设计的一种基础语言。1972年由美国贝尔科研所推出,1978年之 后开始相继在其他计算机上进行使用,经过多年的发展的进步,c语言已经成为一门成熟 、专业的计算机科学学科。在当下计算机软件技术迅速发展的前提之下,c语言程序设计 已成为现代化编程的主流。c语言能够广泛的应用于各种科研领域,与它自身优点和特性 密不可分。 (1)c语言可以在dos、windows、linux等多种操作系统下进行程序编写,不限制操作平 台,具备强大的功能。(2)c语言具有很强的应用性,能够在计算机科技产业广泛运 用、快速投产、并且逐步产生可观的经济效益。(3)c语言是程序设计、软件开发最根 本的前提和基础。(4)c语言在计算机领域发展空间广阔。(5)c语言具备强大的描 述功能和语言结构,是操作系统教学和数据结构教学的课程基础,满足当下计算机专业 课程教学的需要。 2 目前高校计算机专业的发展现状 在我国经济迅速发展和科学不断进步的共同作用之下,计算机技术已经成为现代社会应 用最为普遍的科技成果,给社会带来了最本质的改观和深远影响。高校的计算机相关专 业的设立,为计算机科技行业的持续发展源源不断输送人才,积极推进了全民计算机技 术相关知识的普及和运用。随着信息时代的全面到来,我国高校的计算机相关专业的规 模在不断壮大。截止到目前为止,全国范围内大约有上千家高校开设计算机专业。同其 他学科的专业设置情况相比较,高校计算机专业的课程设置类型和专业规模都首屈一指 。 为满足社会发展的需求,高校计算机相关专业课程不断进行改革以培养适应时代发展的 科技型人才。在课程教学,高校计算机专业的从业教师以现有课程体系为基础,注重 知识的及时更新和实践练习、前沿操作技术的引入、教学模式和教学内容的完善。在多 方努力之下,我国高校计算机专业在探索蓬勃发展、稳步前行。 结合当前社会形势和经济形势对计算机相关人才的专业和技术要求,高校的计算机专业 现状仍然存在很多问题。对于高校计算机相关专业的学生而言,计算机操作水准和应用 能力已经成为衡量个人素质及能力的重要标杆。快节奏的社会生活要求计算机专业的大 学生在具备理论知识素养的同时,也要有熟练的专业技能和丰富的实践经验。因而高校 计算机专业教学所面临最为严峻的问题就是能否使教学内容与时俱进;能否培养出适应 社会需要的专业型、复合型人才。 就目前高校计算机专业教学现状而言,专业师资力量的匮乏、传统的"填鸭式"方法在理 论教学依旧存在、理论知识与技术操作设置失衡、书面考试仍旧作为常规考核办法, 这些不利于计算机专业学生发展的弊病较为普遍、常见。在高校计算机专业课程体制之 硬件系统教学薄弱、软件系统方面缺乏实践练习、相关实验受到条件严重限制、课程 体系落伍、数据及网络理论得不到良好消化等问题还没有得到全面解决。相关教育部门 和高校自身针对上述问题相继采取了许多改革措施,力争使高校计算机专业教育符合现 代社会的发展需求,尽力缩短课程发展与社会发展之间的距离。 3 c语言在高校计算机专业课程的重要意义 c语言是计算机相关专业最重要的基础课程之一。c语言课程的学习是为了培养学生计 算机编程的基本能力,同时为更多计算机技能的学习打下基础。c语言的应用领域非常广 泛,在计算机图形图像处理、操作系统、软件工程、数据具体分析和数据库相关管理等 方面都需要运用c语言进行设计和编程。决定c语言在计算机科技领域广泛运用的重要因 素之一就是它操作和应用上的可取性。c语言在计算机科技领域的应用优势主要包含以 下几个方面: 3.1 c语言强大的功能优势和良好的使用性能 c语言丰富完备的数据结构设计,能够较为灵活的对数据流进行控制,同时

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值