【发布时间】:2023-04-03 19:55:01
【问题描述】:
memset 的原型是void *memset(void *s, int c, size_t n);。那么为什么第三个参数的类型是 size_t 呢? memset 只是一个例子,我想要更一般的原因。提前致谢。
【问题讨论】:
标签: c
memset 的原型是void *memset(void *s, int c, size_t n);。那么为什么第三个参数的类型是 size_t 呢? memset 只是一个例子,我想要更一般的原因。提前致谢。
【问题讨论】:
标签: c
size_t 是sizeof 运算符的返回类型,用于描述内存大小。对于memset,它指定了内存块(s)中的字节数(n)应该设置为给定值(c)。
size_t 的位大小因目标平台的地址空间而异。它并不总是与寄存器大小相关。例如,在分段内存架构中,sizeof (size_t) 可以小于sizeof (void *)。通常,size_t 在 32 位机器上是 4 个字节,在 64 位机器上是 8 个字节,等等。
【讨论】:
sizeof (size_t) can be smaller than the sizeof (void *)吗?非常感谢;)
size_t 变量而不是memset 任何字节,因为(1 << 20) % (1 << 16) == 0。
memset 2^16 字节而不是2^20 或2^24 的原因是必须将段偏移寄存器更改为超过64 kB。否则,地址将返回到开头。为了防止这种情况,使用 16 位 size_t 和 32 位 void * 是有意义的。请注意,C 支持不同的指针类型来处理分段架构(“近、远和巨大”:en.wikipedia.org/wiki/Intel_Memory_Model)。
size_t 是用于表示对象大小的类型。在 C 中,整数类型(int、long 等)的大小取决于实现,您需要在每个编译器实现上使用正确的类型p,以便大小足以存储所有可能的值。
平台 SDK 附带的标头将有一个 typedef,它将 size_t 映射到正确的整数类型。因此,您只需编写一次memset(),它就会在每个实现中正确编译。
【讨论】:
size_t 是一种适合表示数据对象所需内存量的类型。为无符号整数类型(一般为typedef unsigned int size_t;)。
阅读this链接了解更多信息。
【讨论】:
unsigned int 是 32 位,而 size_t 是 64 位。
size_t 保证足够大以容纳所有平台上的指针。
【讨论】:
intptr_t 和 uintptr_t 类型,它们大到足以容纳任何对象指针(即不是函数指针),包括 void *。同时size_t 只需要足够大就可以代表,顾名思义,大小。例如,考虑一个分段架构,其中“远”指针可能指向当前段之外的内存,但指向的内存区域必须适合单个段;指针可以是 32 位,带有 16 位 size_t。