内容简介:在学习C语言的时候,遇到了一个新的数据类型size_t,截止目前也没有完全理清这个类似的具体场景及出现的原因。size_t是一些C/C++标准在stddef.h中定义的。size_t的真实类型与操作系统有关:可以看到,在这里
在学习 C语言 的时候,遇到了一个新的数据类型size_t,截止目前也没有完全理清这个类似的具体场景及出现的原因。
size_t是一些C/C++标准在stddef.h中定义的。size_t的真实类型与操作系统有关:
#ifndef __SIZE_TYPE__ #ifdef _WIN64 #define __SIZE_TYPE__ long long unsigned int #else #define __SIZE_TYPE__ long unsigned int #endif #endif
可以看到,在这里
- 64位架构中被定义为:long long unsigned int
- 32位架构中被定义为:long unsigned int
size_t在32位架构上是4字节,在64位架构上是8字节,而int在不同架构下都是4字节,与size_t不同;且int为带符号数,size_t为无符号数。由于其是无符号的,所以其最大值在32位系统中是int的2倍,在64位系统中是4倍。
size_t 能存储理论上可行的任何类型(包括数组)对象的最大大小。size_t 通常用于数组下标和循环计数。比如将将unsigned int用作数组下标,可能会导致溢出。
C语言标准库里面经常会看到这样的函数:接收一个代表“字节大小”的值作为参数,或者返回一个代表“字节大小”的返回值。
// Declaration of various library function // Here argument of n refers maximum blocks that can be // allocated which is guaranteed to be non-negative void *malloc(size_t n); // While copying 'n' bytes from 's2' to 's1' // n must be non-negative integer void *memcpy(void *s1, void const *s2, size_t n); // strlen() use size_t because lengt of string has // to be atleast 0 size_t strlen(char const *s);
其中:
- 函数malloc(n),其中的参数n表示需要分配“多少字节”的内存大小。
- 函数memcpy(s1, s2, n),其中的参数n表示需要复制的“字节大小”。
- 函数strlen(s)的返回值表示字符串的“长度大小”。
表示大小为什么不直接用int类型,而非得搞个size_t?
以size_t strlen(char const *s)为例,由于字符串的长度永远不可能为负数,而int是允许负数的,有一半的数字被浪费了,明显用unsigned int会更好(同样的字节数),有效的数字多了一倍,从语义也更合理。那为什么不直接使用unsigned int?学过计算机组成原理应该不会对此有疑问。int小于等于数据线宽度,size_t大于等于地址线宽度。size_t存在的最大原因可能是因为:地址线宽度历史中经常都是大于数据线宽度的。目前的int普遍是32位,而size_t在主流平台中都是64位。因为无论int还是unsigned都很可能小于size_t需要的大小,所以必须有个size_t。
为什么要把类型命名为“size_t”?
sizeof()方法返回类型,表示一个size。所以从名字很直观能了解。C语言库自身使用typedef为那些可能依据C语言实验的不同而不同的类型创建类型名,这些类型的名字经常以_t结尾(_t的意思显然就是type),使用这样的命名方式主要是变量与类型共享同一个命名空间,因而需要在命名规则上刻意区分开来。比如ptrdiff_t、size_t、wchar_t。
- wchar_t就是wide char type,“一种用来记录一个宽字符的数据类型”。
- ptrdiff_t就是pointer difference type,“一种用来记录两个指针之间的距离的数据类型”。
参考链接:
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- GO语言学习笔记(四)GO语言控制语句
- GO语言学习笔记(一)Go语言的初步了解
- GO语言学习笔记(五)GO语言函数的简易计算
- 【Go语言学习】Linux下Go语言的安装与设置
- Go语言学习笔记02--go语言运算符与流程控制分支语句
- go语言学习
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。