文章内容参考:
定义
是一些C/C++标准在stdef.h
中定义的,其目的在于方便不同系统之间的移植。
size_t
被用来表示C/C++中任何对象所能达到的最大长度,本身是无符号整数类型
。
size_t
的声明是实现相关的,它出现在一个或多个标准头文件中,比如stdio.h
和stdlib.h
,典型定义如下:
#ifndef _SIZE_T_
#define _SIZE_T_
typedef unsigned int size_t;
#endif
需要注意的是:在不同的系统上,size_t
的定义可能不一样,在32位系统上定义为unsigned int
,而在64位系统上定义为unsigned long
,因此其长度并不固定,而是取决于平台,这是为了提供一种可移植的方法来声明与系统中可寻址的内存区域一致的长度。
用途
size_t在数组下标和内存管理函数之类的地方广泛使用。例如:
size_t被用作sizeof
操作符的返回值类型。此外,它也是很多函数的参数类型,例如malloc
和strlen
。
注意事项
- size_t是无符号整数。
- size_t的实际长度取决于具体实现,通常在32位系统上长度为32位,而在64位系统上长度为64位。一般来说,size_t的最大长度为
SIZE_MAX
。
ssize_t
和size_t类似,唯一的区别在于ssize_t
是有符号的。
16位、32位、64位机器的区别
char | short | int | long | long long | 指针 | |
---|---|---|---|---|---|---|
16位 | 1B | 2B | 2B | 4B | 2B | |
32位 | 1B | 2B | 4B | 4B | 8B | 4B |
64位 | 1B | 2B | 4B | 8B | 8B | 8B |
编程中对于整数类型的注意事项
- 为了保证平台的通用性,尽可能不使用
long long
,这是因为16位操作系统中long long
不存在。 - 在使用整数类型时,尽可能使用
stdlib.h
中定义的类型,它们是通过typedef
对int
进行了定义,尽可能地避免了跨平台字长不同的问题:- int8_t : typedef signed char;
- uint8_t : typedef unsigned char;
- int16_t : typedef signed short ;
- uint16_t : typedef unsigned short ;
- int32_t : typedef signed int;
- uint32_t : typedef unsigned int;
- int64_t : typedef signed long long;
- uint64_t : typedef unsigned long long;
intptr_t
在使用int时,也可以使用intptr_t
来保证平台的流动性,它在不同的平台上编译时的长度不同,但都是标准的平台字长
。例如在64位机器中,其长度为8字节;而在32位机器中,其长度为4字节。使用它可以安全地进行整数和指针之间的转换运算,也就是说:当需要使用指针作为整数运算时,将其转化为intptr_t
进行运算才是安全的。
该类型定义于stddef.h
头文件中:
#if _WORDSIZE == 64
typedef long int intptr_t;
#else
typedef long int intptr_t;
#endif
它也有相应的无符号类型:uintptr_t
。