size_t仅适用于C++标准或C标准吗?
我在"/ usr/include"树中找不到定义size_t的C头.
如果它不在C标准中,那么GCC是否正在做一些神奇的工作?
谢谢,陈兹
我想声明一个非常大的数组.我发现数组的最大大小是size_t,定义为UINT_MAX
所以我写了这样的代码
int arr[UINT_MAX];
Run Code Online (Sandbox Code Playgroud)
当我编译它时,它表示数组维度溢出
但是当我写这样的时候
size_t s = UINT_MAX;
int arr[s];
Run Code Online (Sandbox Code Playgroud)
它编译得当.有什么不同
由于size_t可以是32位或64位,具体取决于当前系统,最好始终将size_t作为参考或const引用传递给函数,因此它总是4个字节?(如果它是8个字节你必须复制)我看过的很多开源代码都没有这样做,但是如果它们的编译器支持64位整数,那些64位整数总是作为引用传递.他们为什么不为size_t这样做呢?我想知道你的意见是什么.
我想分配一个2.9GB的char数组
database = (char*) malloc((2900 * 1000000 * sizeof(char)));
Run Code Online (Sandbox Code Playgroud)
这给出了整数溢出警告和malloc返回NULL.的
malloc参数的类型的size_t根据文档其是类型的
unsigned int.
所以最大应该UINT_MAX是至少2.9GB.但是,如果我尝试分配超过MAX_INT了malloc失败.这是否意味着
size_t我的系统是int类型?我该如何检查?我看了看
/usr/include/stdlib.h
Run Code Online (Sandbox Code Playgroud)
和
./lib/gcc/x86_64-redhat-linux/4.1.1/include/stddef.h
Run Code Online (Sandbox Code Playgroud)
但找不到定义size_t.非常感谢
我正在阅读size_tC/C++中的文章http://web.archive.org/web/20081006073410/http://www.embedded.com/columns/programmingpointers/200900195(通过Stackoverflow找到的链接).
从文章引用:
类型size_t是一个typedef,它是某些无符号整数类型的别名,通常是unsigned int或unsigned long,但可能是unsigned long long.每个标准C实现都应该选择足够大的无符号整数 - 但不要大于需要 - 来表示目标平台上最大可能对象的大小.
如何确定机器上最大可能对象的大小?
什么影响最大对象的大小(除了处理器)?
欢迎详细解释链接.
我正在研究一个更新20年代码的项目,其中许多问题都与整数溢出有关.我想确保我正确测试溢出,所以我写了一个测试程序.它的输出让我感到沮丧.这里是:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <limits.h>
int main (void) {
size_t largerNum,Num;
largerNum = 12;
Num = UINT_MAX;
printf("largerNum = %u\nNum = %u\nNum + 1 = %u\n", largerNum , Num, Num + 1);
largerNum = Num + 1;
printf("largerNum now = %u\n", largerNum);
if(largerNum < Num ){
printf("largerNum overflowed to %u\n", largerNum);
}
else {
printf("largerNum did not overflow: %u\n", largerNum);
}
printf("Is (0 < UINT_MAX)?\n");
(0 < UINT_MAX)?printf("YES\n"):printf("NO\n");
printf("Is (largerNum < Num)?\n");
(largerNum < Num)?printf("YES\n"):printf("NO\n");
return …Run Code Online (Sandbox Code Playgroud) cstdinttypedef 肯定可以绑定到char变量.例如,它很可能uint_least8_t与之结合unsigned char并int_least8_t结合signed char.
标准是否保证类似的东西不会发生size_t或类似的类型?或者至少有一个纯理论上的机会,这些类型将绑定到某些字符类型,unsigned char甚至可能wchar_t?
如果我使用intindex来访问vector元素,它会将整数转换为size_t,然后调用operator[](size_t)函数吗?是否有任何性能下降?
编译调用的代码时收到警告 write()
warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
这是write()的定义:
ssize_t write(int fd, const void *buf, size_t count);
RETURN VALUE
On success, the number of bytes written is returned (zero indicates
nothing was written). On error, -1 is returned, and errno is set
appropriately.
Run Code Online (Sandbox Code Playgroud)
这对我来说很奇怪.假设ssize_t是int,我最终写了一些大的(> 2GB).我不能只使用write()vs count的返回值的比较,可以吗?
(编辑:也许我应该正确地写下我的问题:在没有得到警告的情况下使用write()的正确方法是什么,也不会遇到符号转换后计数== -1的情况?是的,我知道它是未定义的行为)
在这篇由Andrey Karpov撰写的题为"关于size_t和ptrdiff_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,但让我们完全避免这种情况.我只问这种类型