C语言学习:size_t

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

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

参考链接:


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

查看所有标签

猜你喜欢:

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

精通Python设计模式

精通Python设计模式

[荷] Sakis Kasampalis / 夏永锋 / 人民邮电出版社 / 2016-7 / 45.00元

本书分三部分、共16章介绍一些常用的设计模式。第一部分介绍处理对象创建的设计模式,包括工厂模式、建造者模式、原型模式;第二部分介绍处理一个系统中不同实体(类、对象等)之间关系的设计模式,包括外观模式、享元模式等;第三部分介绍处理系统实体之间通信的设计模式,包括责任链模式、观察者模式等。一起来看看 《精通Python设计模式》 这本书的介绍吧!

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

在线压缩/解压 JS 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器