繁体   English   中英

渴望返回size_t?

[英]strlen to return size_t?

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

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

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

那是什么样的弦? 我的操作系统是否在此问题上起作用? 我使用的是MAC 64位操作系统。

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

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

谢谢!

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

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

POSIX strlen() 确实返回size_t

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

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

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

至少从ISO C90开始, strlen()返回size_t -我刚刚签入副本。 并且该标准与ANSI C89应该没有技术上的区别。

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

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

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

此外, size_t是无符号的,具有特定的大小,与体系结构相关,并且在语义上不同于仅用于存储从办公室周围树木到您的SO名声的任何数字的通用int

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM