strlen返回size_t?

时间:2011-04-19 13:03:44

标签: c string strlen

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

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

上下文:我喜欢使用gmp库并将大数字转换为字符串,我最终得到了上述情况。

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

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

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

谢谢!

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

6 个答案:

答案 0 :(得分:4)

问题是int可能不够宽,无法存储整个范围的可能长度值。例如,在64位上,您可以使用长度超过4千兆字节的字符串,如果int为32位,则无法通过int变量返回这样长字符串的长度。

答案 1 :(得分:3)

POSIX strlen() does return size_t

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

答案 2 :(得分:3)

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

我想原因是int有符号,偶数unsigned int的容量可能不足以保存元素的大小(比如说你在x86-64上有一个32位int 16GB RAM)......这个例子很极端,但可能。

答案 3 :(得分:2)

strlen()返回size_t,因为至少ISO C90 - 我刚刚查看了我的副本。此标准与ANSI C89没有技术差异。

约定有变化(size_t不在K& R C中),但是很久以前。

答案 4 :(得分:2)

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

答案 5 :(得分:1)

当涉及到内存块的长度时,标准库中的所有函数都与size_t一起工作有一个非常简单和合乎逻辑的原因 - 内置sizeof运算符产生一个{ {1}}结果也是如此。

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