C语言中的size_t数据类型是什么?-IDC帮帮忙

size_t是无符号整数数据类型,在各种头文件中定义,如:

<stddef.h>, <stdio.h>, <stdlib.h>, <string.h>, <time.h>, <wchar.h>

它是一种用于表示以字节为单位的对象大小的类型,因此可以由sizeof运算符返回。所以它保证足够大,可以包含系统可以处理的最大对象的大小。基本上,最大允许大小取决于编译器。如果编译器是32位,那么对于unsigned int,它只是typedef(即别名),但如果编译器是64位,那么它将是unsigned long long的typedef 。简而言之,size_t永远不会消极。
因此,C语言的许多库函数声明它们的参数并返回类型为size_t,malloc,memcpy和strlen。例如,

// 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);

size_t或任何无符号类型可能被视为循环变量,因为循环变量通常大于或等于0。

注意:当我们使用size_t对象时,我们必须确保在使用它的所有上下文中,包括算术,我们只需要非负值。例如,以下程序肯定会给出意想不到的结果:

// C program to demonstrate that size_t or
// any unsigned int type should be used
// carefully when used in a loop
#include<stdio.h>
int main()
{
    const size_t N = 10;
    int a[N];
    // This is fine
    for (size_t n = 0; n < N; ++n)
        a[n] = n;
        
    // But reverse cycles are tricky for unsigned
    // types as can lead to infinite loop
    for (size_t n = N-1; n >= 0; --n)
        printf("%d ", a[n]);
}
输出 
无限循环然后分段fauilt