我和c中的size_t搞混了,我知道它是由sizeof操作符返回的。但它究竟是什么?它是数据类型吗?

假设我有一个for循环:

for(i = 0; i < some_size; i++)

我应该用int I吗?或者size_t i;?


当前回答

Size_t和int是不可互换的。例如,在64位Linux上size_t的大小是64位的(即sizeof(void*)),而int是32位的。

还要注意size_t是无符号的。如果你需要签名版本,那么在某些平台上有ssize_t,它与你的例子更相关。

作为一般规则,我建议在大多数情况下使用int,只有在特定需要时才使用size_t/ssize_t(例如mmap())。

其他回答

根据我的理解,size_t是一个无符号整数,其位大小足以容纳本机体系结构的指针。

So:

sizeof(size_t) >= sizeof(void*)

Size_t是无符号整数数据类型。在使用GNU C库的系统上,这将是unsigned int或unsigned long int。Size_t通常用于数组索引和循环计数。

Size_t是一种无符号整型数据类型,它只能赋0和大于0的整型值。它测量任何对象大小的字节,并由sizeof操作符返回。

Const是size_t的语法表示,但是没有Const你也可以运行程序。

const size_t number;

Size_t经常用于数组索引和循环计数。如果编译器是32位的,它将在unsigned int上工作。如果编译器是64位的,它也可以在unsigned long long int上工作。size_t的最大大小取决于编译器类型。

Size_t已经在<stdio.h>头文件中定义,但它也可以由 <stddef.h>, <stdlib.h>, <string.h>, <time.h>, <wchar.h>头文件。

示例(使用const)

#include <stdio.h>

int main()
{
    const size_t value = 200;
    size_t i;
    int arr[value];

    for (i = 0 ; i < value ; ++i)
    {
        arr[i] = i;
    }

    size_t size = sizeof(arr);
    printf("size = %zu\n", size);
}

输出:size = 800


示例(不含const)

#include <stdio.h>

int main()
{
    size_t value = 200;
    size_t i;
    int arr[value];

    for (i = 0; i < value; ++i)
    {
        arr[i] = i;
    }

    size_t size = sizeof(arr);
    printf("size = %zu\n", size);
}

输出:size = 800

types.h的manpage说:

Size_t应该是无符号整数类型

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]);
}

Output
Infinite loop and then segmentation fault