C 编程,动态内存无法使用Malloc和Calloc正常工作



我刚刚开始学习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。看来您希望他们返回数组的大小,但是您需要了解ab不是/strong>数组。它们是int的指针。如果sizeof(int)为4,则sizeof(*a)也将为4,并且在编译时间已经知道。

话虽如此,您无需在C 中使用C库函数malloc()calloc()。如果需要手动内存分配,请使用newdelete

a = new int;
b = new int[5];

如果您需要像calloc这样的零启动化,只需使用()即可默认构造分配的整数:

a = new int();
b = new int[5]();

而不是free(),使用deletedelete[],具体取决于以前调用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 代码不应对newdeletemalloc()calloc()free()进行任何呼叫。进行手动内存管理需要更多的代码,并且容易出错。使用vectorshared_ptrunique_ptr等智能指针等容器,以减少内存的机会和其他资源泄漏。这些更安全的类型也更加方便。例如,使用vector,您不必自己记住分配的内存的大小。vector跟踪您的大小。您也可以通过直接分配它们来轻松复制向量。您也不需要手动deletefree()矢量。它们出现范围时会自动删除。

作为旁注,我建议摆脱使用endl打印新线的习惯。endl冲洗流,不仅要打印新线。如果使用它,您将不断冲洗输出流,这是一个缓慢的操作。您很少需要冲洗流,在这种情况下,您只需使用<< flush即可手动进行。

您在第一种情况下将指针的尺寸和第二个元素的大小占据。*a是出于您的意图和目的,与[0]相同。指针的大小取决于体系结构,int的大小为4。

在编译时评估尺寸值。动态内存分配发生在运行时。为了找出运行时间分配的金额,您可以查看新操作员(不推荐(或按照注释建议使用容器。

sizeof(a)是指针的大小(通常是64位体系结构中的8个(,而 sizeof(*a)是指向元素的大小(整数值(。sizeof运算符返回的任何内容都具有动态性质(作为calloc(3)返回的元素数(

顺便说一句,calloc()在C 中强烈弃用。它的用途保留给您必须将指针传递给C代码和遗留代码的情况。使用操作员newnew [](在这种情况下为最后一个(。但是这些都不会改变事物,sizeof操作员将继续返回您获得的值。如果要检查返回的数组的大小,请检查传递给两个操作员的参数。

相关内容

  • 没有找到相关文章

最新更新