C++中"size_t"详解

本文介绍了size_t类型的定义及其在不同系统中的表现形式,并探讨了其在C/C++编程中的使用及注意事项,特别是与strlen函数结合时可能出现的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

size_t 类型

size _t 为了增强程序的可移植性,便有了size_t ,不同系统上,定义size_t可能不一样。经测试发现,在32位系统中size_t是4字节的,在64位系统中,size_t是8字节的,这样利用该类型可以增加程序移植性。

size_t定义在/usr/include/linux/types.h,跟体系结构相关      

<span style="font-family:SimSun;font-size:12px;">typedef _kernel_size_t size_t;</span>

而__kernel_size_t 定义在 /usr/include/asm/posix_types.h ,安装的是内核的源码

<span style="font-family:SimSun;font-size:12px;">asm-i386/posix_types.h
              typedef unsigned int __kernel_size_t;
asm-1a64/posix_types.h
              typedef unsigned long kernel_size_t;</span>

size_t是一种无符号的整型数,它的取值没有负数,在数组中也用不到负数,而它的取值范围是整型数的双倍。sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。

size_t 的陷阱

程序:

<span style="font-family:SimSun;font-size:12px;">#include <stdio.h>
#include <string.h>
int main()
{
    int i = -1;
    if(i > strlen("Demon"))
        printf("Hello World");
    else
        printf("Hello Demon");
    return 0;
}</span>

输出的竟然是Hello World!-1 > 5?!

仔细想想,原来问题出在strlen上,strlen返回的类型是size_t,size_t的定义为:

<span style="font-family:SimSun;font-size:12px;">typedef unsigned int size_t;</span>

即无符号的整型,而i的类型是int,即有符号的整型。当有符号整型和无符号整型进行运算时,有符号整型会先自动转化成无符号。-1转化成无符号数为4294967295,远远大于5。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值