2

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

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

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

那是怎样的一根弦?我的操作系统是否在此问题中起作用?我使用 MAC,64 位操作系统。

编辑:我收到的错误信息是:

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

谢谢!

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

4

6 回答 6

6

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

于 2011-04-19T13:05:24.363 回答
3

POSIXstrlen() 确实返回size_t.

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

于 2011-04-19T13:05:05.957 回答
3

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

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

于 2011-04-19T13:11:51.553 回答
2

strlen()size_t至少从 ISO C90 开始返回- 我刚刚签入了我的副本。而且这个标准应该与ANSI C89没有技术差异。

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

于 2011-04-19T13:14:05.093 回答
2

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

于 2011-04-19T13:33:09.017 回答
1

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

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

于 2011-04-19T13:49:48.757 回答