渴望返回size_t?

问题描述

| 在C中: 我的字符串长度函数返回的是“ 0”值? 为什么不返回常规的整数?我注意到的另一件事是,当我尝试将此字符串与另一个字符串连接时,运行程序时收到总线错误。 上下文:我有点喜欢使用gmp库并将大数字转换为字符串,但最终遇到了上述情况。 那是什么样的弦?我的操作系统是否在此问题上起作用?我使用的是MAC 64位操作系统。 编辑:我收到的错误消息是:
: warning: format ‘%d’ expects type ‘int’,but argument 3 has type ‘size_t’
谢谢! @all:谢谢您的回答,但我认为我会将总线错误作为另一个问题,因为这似乎是一个不同的问题。

解决方法

问题是
int
可能不够宽,无法存储可能的长度值的整个范围。例如,在64位上,您可以拥有一个大于4 GB的字符串,如果
int
是32位,则无法通过
int
变量返回这么长的字符串的长度。,
strlen()
总是返回
size_t
...并且POSIX标准也这样说。 我想这是因为
int
具有符号,甚至
unsigned int
的容量也不足以容纳元素的大小(例如,如果在x86-64上具有16GB RAM的是32bit int)...这个例子是极端的,但可能。,POSIX
strlen()
确实返回
size_t
。 对于导致总线错误的原因,如果不查看代码并了解有关更改的确切性质的更多详细信息,就不可能说。一种可能是您造成了缓冲区溢出,或者使用不应该执行的
NULL
指针进行了某些操作。,要解决您的警告(实际上是一个错误-您通过将错误的类型传递给
printf
来调用未定义的行为),您应该使用
%zu
而不是
%d
来打印
size_t
值。,至少从ISO C90起,
strlen()
返回
size_t
-我刚刚签入了副本。并且该标准与ANSI C89应该没有技术上的区别。 约定发生了变化(K&R C中没有ѭ0)),但这是很久以前的事情了。,对于内存块的长度,标准库中的所有功能都可以使用
size_t
是非常简单且合乎逻辑的原因-内置的
sizeof
运算符也会产生
size_t
结果。 而且,
size_t
是无符号的,具有特定的大小,与体系结构相关联,并且在语义上不同于仅是
int
,后者用于存储从办公室周围的树木数量到您的SO信誉的任何数量。