【问题标题】:strlen to return size_t?strlen 返回 size_t?
【发布时间】:2011-04-19 13:03:43
【问题描述】:

在 C 中:
我的字符串长度函数返回 size_t 值?

为什么它不返回一个传统的整数?我注意到的另一件事是,当我尝试将此字符串与另一个字符串连接时,我在运行程序时收到了总线错误。

上下文:我有点玩 gmp 库并将大数字转换为字符串,我最终遇到了上述情况。

那是什么类型的字符串?我的操作系统是否在此问题中起作用?我使用 MAC,64 位操作系统。

已编辑:我收到的错误消息是:

: warning: format ‘%d’ expects type ‘int’, but argument 3 has type ‘size_t’

谢谢!

@all:感谢您的回答,但我想我会将总线错误作为另一个问题,因为这似乎是一个不同的问题。

【问题讨论】:

  • size_t 整数数据类型。总线错误很可能与此完全无关,您可能只是超出了缓冲区,在某处有一个悬空/空指针或类似的东西。
  • @Mat 整数部分现在已经澄清了,但是对于我使用 strcat 作为两个字符指针的任何程序,总线错误变得很常见。
  • 专门为此打开一个新问题,其中包含一些代码 sn-ps,显示您如何使用 strcat

标签: c string strlen


【解决方案1】:

问题是int 可能不够宽,无法存储所有可能的长度值。例如,在 64 位上,您可以拥有超过 4 GB 的字符串,如果 int 是 32 位,则您不可能通过 int 变量返回如此长的字符串的长度。

【讨论】:

    【解决方案2】:

    strlen() 总是返回 size_t ... POSIX 标准也这么说。

    我猜原因是int 有符号,即使unsigned int 的容量也可能不足以容纳元素的大小(例如,如果您在 x86-64 上有一个 32 位 int 和 16GB RAM)。 .. 这个例子很极端,但也有可能。

    【讨论】:

      【解决方案3】:

      POSIX strlen()does return size_t

      至于导致总线错误的原因,如果不查看代码并了解有关更改的确切性质的更多详细信息,就不可能说清楚。一种可能是您导致缓冲区溢出或使用 NULL 指针做了一些您不应该做的事情。

      【讨论】:

      • @sharptooth:谢谢你!关于如何调试总线错误的任何想法?
      • @Maverickgugu:在 gdb 中运行程序或查看核心转储可能是一个好的开始。
      【解决方案4】:

      要解决您的警告(这实际上是一个错误 - 您通过将错误的类型传递给 printf 来调用未定义的行为),您应该使用 %zu 而不是 %d 来打印 size_t 值。

      【讨论】:

      • 是的。我意识到 size_t 可以使用 %ld 打印。但是 %zu 似乎也是一个不错的选择。谢谢!
      • %ld 不一定正确。事实上,它会在size_t 被定义为unsigned int 的大多数 32 位系统上发出警告——即使这里的类型大小相同,unsigned intunsigned long 仍然不是相同的类型.
      【解决方案5】:

      strlen() 返回一个size_t,至少因为 ISO C90——我刚刚签入了我的副本。而且这个标准应该和ANSI C89没有技术上的区别。

      约定发生了变化(size_t 不在 K&R C 中),但那是很久以前的事了。

      【讨论】:

      • 谢谢!我现在才意识到.. 给 ISO-C90 一个完整的读数是否可取。或在出现问题时将其用作参考!
      【解决方案6】:

      当涉及到内存块的长度时,标准库中的所有函数都使用size_t 有一个非常简单且合乎逻辑的原因 - 内置的sizeof 运算符产生size_t 结果为好吧。

      此外,size_t 是无符号的,具有特定的大小,与架构相关联,并且在语义上与通用的 int 不同,后者用于存储从办公室周围的树木数量到 SO 声誉的任何数字.

      【讨论】:

      • 我不知道 int 保证足以存储 SO 代表。不保证至少能存储-32768+32767吗? :p
      • @Thomas 最小范围 int 是 -32767 到 +32767 C11 §5.2.4.2.1。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多