【发布时间】:2020-11-01 18:29:37
【问题描述】:
我想使用ftell 来获取流的当前位置,但我希望能够将其类型转换为size_t,这将是一个无符号的。有符号和无符号是不同的,因为一个是有符号的,另一个是无符号的。
ftell 的返回类型是long,与size_t 不同。
那么,在这种情况下使用ftell 时,使用size_t 代替long 是否安全?
char *s = malloc(ftell(whateverstream));
我将使用ftell 进行动态内存分配,所以我想知道使用 long 而不是 size_t 是否安全。
【问题讨论】:
-
ftell可以返回负值,因此该行代码不安全。 -
你应该总是先检查返回值,如果发生错误它会是负数。然后你知道它是积极的并且可以使用它
-
通常是的,它是安全的(在验证返回为非负数之后),而
size_t和long通常应该具有相同的等级,实现可以选择做不同的事情@987654321 @ -
你怎么知道
size_t“这将是一个无符号长整数”?如果您知道因为它特定于您正在使用的 C 实现,那么将非负的long值转换为size_t是安全的。如果你“知道”它是因为你认为 C 是这样工作的,那么它就是不安全的。 C 标准允许size_t比long窄,并且磁盘上的文件可以大于内存地址空间。 -
@EricPostpischil 你是对的。而不是说
unsigned long,我应该知道它是unsigned而不是signed。感谢您的认可。