我刚刚开始学习C ,我遇到了一个我在互联网上找不到的问题,所以我希望您可以帮助我。
这是我的代码:
int* a;
int* b;
a = (int*)calloc(1, sizeof(int));
b = (int*)calloc(5, sizeof(int));
cout << sizeof(a) << endl;
cout << sizeof(b) << endl;
编译器返回我的是:8,8。如果我使用:
cout << sizeof(*a) << endl;
cout << sizeof(*b) << endl;
编译器返回4,4。
Malloc也是如此。我正在使用。
我在做什么错?为什么如果int长4个字节长,为什么b 20的大小不高5倍?
谢谢!
sizeof(*a)
和 sizeof(*b)
始终等于4。看来您希望他们返回数组的大小,但是您需要了解a
和b
是不是/strong>数组。它们是int
的指针。如果sizeof(int)
为4,则sizeof(*a)
也将为4,并且在编译时间已经知道。
话虽如此,您无需在C 中使用C库函数malloc()
和calloc()
。如果需要手动内存分配,请使用new
和delete
:
a = new int;
b = new int[5];
如果您需要像calloc
这样的零启动化,只需使用()
即可默认构造分配的整数:
a = new int();
b = new int[5]();
而不是free()
,使用delete
或delete[]
,具体取决于以前调用new
的方式:
delete a; // Note: no '[]'
delete[] b; // Needs '[]'
但是,您不需要这里的手动内存分配。只需使用std::vector<int>
:
#include <vector>
// ...
std::vector<int> a(5); // 5 int elements, zero-initialized.
std::cout << a.size() << 'n'; // Will print '5'.
作为经验法则,您的C 代码不应对new
,delete
,malloc()
,calloc()
或free()
进行任何呼叫。进行手动内存管理需要更多的代码,并且容易出错。使用vector
和shared_ptr
和unique_ptr
等智能指针等容器,以减少内存的机会和其他资源泄漏。这些更安全的类型也更加方便。例如,使用vector
,您不必自己记住分配的内存的大小。vector
跟踪您的大小。您也可以通过直接分配它们来轻松复制向量。您也不需要手动delete
或free()
矢量。它们出现范围时会自动删除。
作为旁注,我建议摆脱使用endl
打印新线的习惯。endl
冲洗流,不仅要打印新线。如果使用它,您将不断冲洗输出流,这是一个缓慢的操作。您很少需要冲洗流,在这种情况下,您只需使用<< flush
即可手动进行。
您在第一种情况下将指针的尺寸和第二个元素的大小占据。*a是出于您的意图和目的,与[0]相同。指针的大小取决于体系结构,int的大小为4。
在编译时评估尺寸值。动态内存分配发生在运行时。为了找出运行时间分配的金额,您可以查看新操作员(不推荐(或按照注释建议使用容器。
sizeof(a)
是指针的大小(通常是64位体系结构中的8个(,而 sizeof(*a)
是指向元素的大小(整数值(。sizeof
运算符返回的任何内容都具有动态性质(作为calloc(3)
返回的元素数(
顺便说一句,calloc()
在C 中强烈弃用。它的用途保留给您必须将指针传递给C代码和遗留代码的情况。使用操作员new
和new []
(在这种情况下为最后一个(。但是这些都不会改变事物,sizeof
操作员将继续返回您获得的值。如果要检查返回的数组的大小,请检查传递给两个操作员的参数。