我想在C / C ++中定义一个整数变量,这样我的整数可以存储10个字节的数据,或者可以是我在程序中定义的x个字节的数据。 目前..! 我试过了
int *ptr;
ptr = (int *)malloc(10);
代码。现在,如果我找到pof的大小,它显示为4而不是10.为什么?
答案 0 :(得分:3)
C和C ++编译器实现了几种大小的整数(通常是1,2,4和8字节{8,16,32和64位}),但没有一些辅助代码来执行算术运算,你真的不能制作任意大小的整数。
你做的声明:
int *ptr;
ptr = (int *)malloc(10);
制作可能是整数排列的数组。因为除非你在(10 % sizeof(int) ) == 0)
的系统上,否则你会在末尾有额外的字节而不能用来存储整个整数。
您应该能够为C ++找到几个大数字类库,这些库实现了您可能想要在10字节(80位)整数上执行的许多操作。使用C,你必须作为函数调用进行操作,因为它没有运算符重载。
您的sizeof(ptr)
评估为4,因为您使用的是使用4字节指针(32位系统)的计算机。 sizeof
不会告诉您指针指向的数据大小。这个问题应该变得棘手的唯一地方就是你在数组名称上使用sizeof
,这与在指针上使用它不同。我之所以提到这一点,是因为数组名称和指针有很多相似之处。
答案 1 :(得分:2)
因为在你的机器上,指针的大小是4字节。请注意,变量ptr
的类型为int *
。如果sizeof
或malloc
是内存,则new
运算符无法获得完整的分配大小,因为sizeof
是编译时运算符,这意味着在编译时会对值进行求值
答案 2 :(得分:2)
它显示4个字节,因为平台上的指针是4个字节。指针地址的内存块可以是任意大小,在你的情况下它是10个字节。如果需要跟踪,则需要创建数据结构:
struct VariableInteger
{
int *ptr;
size_t size;
};
此外,对ptr变量使用int类型并不意味着该语言将允许您对平台上大小不同的任何大小进行算术运算。
答案 3 :(得分:1)
因为指针的大小是4.尝试类似:
typedef struct
{
int a[10];
} big_int_t;
big_int_t x;
printf("%d\n", sizeof(x));
另请注意,int
的大小通常不是1个字节,因此可能会打印20或40个,具体取决于您的平台。
答案 4 :(得分:0)
C ++中的整数具有固定大小。你的意思是一个整数数组?至于sizeof,你使用它的方式,它告诉你指针的大小是四个字节。它不会告诉您动态分配的块的大小。
答案 5 :(得分:0)
很少或没有编译器支持10字节整数运算。如果要使用大于<limits.h>
中指定值的整数,则需要找到支持大整数的库,或者创建自己的类来定义数学运算符。
答案 6 :(得分:0)
我相信你所寻找的东西被称为“任意精度算术”。它允许您拥有任何大小和任意数量的小数。这些库不是使用固定大小的汇编级数学函数,而是编码为数学如何在纸上完成它们。
这是一个指向几种不同语言的任意精度算术库列表的链接,维基百科的赞美:link。