乐闻世界logo
搜索文章和话题

Sizeof vs Strlen

5 个月前提问
4 个月前修改
浏览次数24

1个答案

1

Sizeof与Strlen的区别

Sizeof 是一个编译时运算符,它用于计算变量、数据类型、数组等的内存大小,单位通常是字节。Sizeof的返回值是一个编译时确定的常数,不会随着变量内容的改变而改变。例如:

c
int a; printf("%zu", sizeof(a)); // 在大多数平台上,输出将是4,因为int通常占用4个字节。

在使用sizeof时,不需要变量被初始化。Sizeof对数组时会计算整个数组的大小,例如:

c
int arr[10]; printf("%zu", sizeof(arr)); // 输出将是40,在一个每个int是4字节的系统上。

Strlen 是一个运行时函数,用于计算C风格字符串(以null字符'\0'结尾的字符数组)的长度,不包括结尾的null字符。它通过遍历字符串直到找到第一个null字符来计算字符串的长度。例如:

c
char str[] = "hello"; printf("%zu", strlen(str)); // 输出将是5

这个例子中,尽管数组str分配了6个字节(包含末尾的'\0'),strlen只计算到第一个'\0'前的字符数。

适用场景和注意事项

  • Sizeof 对于知道任何类型或数据结构在内存中的大小非常有用,尤其是在进行内存分配、数组初始化等操作时。
  • Strlen 适用于需要计算字符串实际使用的字符数的场景,比如字符串处理或者在发送字符串至网络之前计算长度。

一个具体的应用实例

假设你正在编写一个函数,该函数需要创建一个用户输入字符串的副本。使用sizeof可能不合适,因为它会返回整个数组的大小,而不是字符串实际使用的长度。这里你应该使用strlen来获取输入字符串的实际长度,然后进行内存分配:

c
char *duplicate_string(const char *src) { size_t len = strlen(src); char *dest = malloc(len + 1); // +1 为了末尾的null字符 if (dest) { strcpy(dest, src); } return dest; }

在这个例子中,使用strlen确保我们只分配了必要的内存,避免了浪费。同时也保证了复制的字符串是正确的和完整的,包括了末尾的null字符。

2024年6月29日 12:07 回复

你的答案