为了迭代数组我们应该使用size_t还是ptrdiff_t?

Eva*_*oll 3 c pointers size-t errata ptrdiff-t

在这篇由Andrey Karpov撰写的题为"关于size_tptrdiff_t"的博客文章中,他展示了一个例子,

for (ptrdiff_t i = 0; i < n; i++)
  a[i] = 0;
Run Code Online (Sandbox Code Playgroud)

但是,我不确定这是否正确,似乎应该如此

for (size_t i = 0; i < n; i++)
  a[i] = 0;
Run Code Online (Sandbox Code Playgroud)

它是否正确?

我知道我们也应该使用类似的东西memset,但让我们完全避免这种情况.我只问这种类型

Pas*_*uoq 8

博客文章中,我认为你应该总是避免分配大于PTRDIFF_MAX(*)的内存块,因为这样做会使像Clang和GCC这样的编译器产生无意义的代码,即使你没有以某种方式减去指向该块的指针.导致结果溢出.

(*)即使malloc成功传递的值大于PTRDIFF_MAX.问题的关键在于GCC和Clang只生成与这样的链接时行为正确的代码malloc,但Glibc提供的malloc函数不实现此限制.

如果您遵循该约束(我鼓励您:这是博客文章的消息),那么这两种类型都是同样正确的.

这就是说,因为只需要表示正偏移量,size_t因此在您的示例中将是自然选择.

  • @jwdonahue:也许你会对[额外,额外 - 阅读所有内容:几乎所有二分搜索和合并排序都被破坏]感兴趣(https://research.googleblog.com/2006/06/extra-extra-read- all-about-it-nearly.html)——一篇来自 Google 的文章,内容是关于数组如何变得足够大以至于索引算术确实会溢出和破坏。 (2认同)
  • @Olaf确认glibc允许在32位平台上分配超过2GiB,这与编译器假设相矛盾,并且决定不改变:https://gcc.gnu.org/bugzilla/show_bug.cgi?id = 67999# C8 (2认同)