【问题标题】:difference between sizeof and strlen in C linuxC linux中sizeof和strlen的区别
【发布时间】:2014-04-25 12:34:08
【问题描述】:

第一个 printf 语句给出输出 3,第二个给出 20。 谁能解释一下这两者有什么区别?

char frame[20],str[20];
printf("\nstrlen(frame)= %d",strlen(frame));
printf("\nsizeof(frame) = %d",sizeof(frame));

谢谢:)

【问题讨论】:

  • 一个是字符串的长度,另一个是指针的大小。这是基本的 C 知识 :)
  • @Stolas none 是指针的大小,尽管 one 是数组的大小。
  • strlen() evals contentrun-time 进行计算。 sizeof 是在编译时推导出来的,并且与内容无关。 两者都包含在 C 语言的任何远程体面的文本中。
  • @Stolas ,除了没有评论,我的系统上的 sizeof 指针是 4。
  • @user3542109 当然,您的程序正在执行未定义的行为。您使用了不正确的格式说明符。 sizeof() 计算为类型 size_t,但您调用 printf() 告诉它该值是系统 int。使用%zu 作为第二个printf()两行都调用了UB(前者调用strlen()在一个内容不确定的缓冲区上,后者是因为我刚才说的原因)。

标签: c linux sizeof strlen


【解决方案1】:

sizeof 是一个编译时运算符,它确定类型消耗的字节大小。在frame (char[20]) 的情况下是 20 个字节。

strlen 是一个运行时函数,它会扫描给定的指针,直到第一次出现 nul 终止符 '\0',然后返回字符数。

【讨论】:

  • @user3542109 因为 frame[] 是一个未初始化的数组,它可能包含直到 frame[3] 的虚假字符,即 '\0'。如果您将其声明为“char frame[20] = {0}”,strlen() 将返回 0
【解决方案2】:
  1. 因为frame的内容没有被初始化,这意味着它不是一个有效的C字符串,所以strlen(frame)可以返回任何值,或者崩溃。实际上,在这种情况下,它的行为是未定义的。

  2. 因为frame是一个20个字符的数组,所以sizeof(frame)会返回20 * sizeof(char),它总是20(sizeof(char)总是等于1)。

【讨论】:

  • 总是只给 3 个。
  • @user3542109 你在另一个操作系统上测试过吗?还是用另一个编译器构建它?
  • no.. 你的意思是它有一个(系统,编译器)的值?
  • @user3542109 不,它在字面上可以有任何价值,它甚至可以在你的程序的运行过程中发生变化。这是 C 的未定义行为之一。
  • 好的..我明天试试。今天它每次都给3。仍然非常感谢您的精彩解释:)
【解决方案3】:

strlen 实际上给出了字符串的长度,而 sizeof 给出了分配内存的大小(以字节为单位)。事实上,http://www.cplusplus.com/reference/cstring/strlen/ 下面给出的摘录在这里得到了很好的解释。

C 字符串的长度由终止空字符确定:C 字符串与字符串开头和终止空字符之间的字符数一样长(不包括终止空字符本身)。

这不应与保存字符串的数组的大小相混淆。例如:

char mystr[100]="测试字符串";

定义了一个大小为 100 个字符的字符数组,但用于初始化 mystr 的 C 字符串的长度只有 11 个字符。因此,当 sizeof(mystr) 计算为 100 时,strlen(mystr) 返回 11。

是的,根据其他 cmets,您正在尝试获取未初始化字符串的长度,这会导致未定义的行为,它可以是 3 或其他任何值,具体取决于为您的字符串分配的内存中存在的任何垃圾.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    • 2012-04-13
    • 2021-07-23
    • 1970-01-01
    相关资源
    最近更新 更多