C语言学习:size_t

栏目: C · 发布时间: 6年前

内容简介:在学习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,“一种用来记录两个指针之间的距离的数据类型”。

参考链接:


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Foundations of PEAR

Foundations of PEAR

Good, Nathan A./ Kent, Allan / Springer-Verlag New York Inc / 2006-11 / $ 50.84

PEAR, the PHP Extension and Application Repository, is a bountiful resource for any PHP developer. Within its confines lie the tools that you need to do your job more quickly and efficiently. You need......一起来看看 《Foundations of PEAR》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

MD5 加密
MD5 加密

MD5 加密工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具