65,140
社区成员
许久没有上社区查看了,翻回到这篇博客,看到了一个比较清晰的对比,与评论区热心朋友们的解答一致,故贴于此处,此贴完结!谢谢大家的耐心解答~
本次有关图的作业需要存储一个复合数据,由于懒得构造结构体便采取数组,希望构建一个v-d-3的三维数组(v为结点数,d为点的degree,3为三个数据:指向点v、时间开销time与金钱开销cost),然而却遇到了一些问题
当采用new开辟三维数组的第一纬v时
gg=new int** [v]; //开辟v个int**指针
后续calloc函数无法进行,其原因为gg==nullptr(猜测),如下图所示:(为保证看清,图片较大,请谅解!)
希望搞明白出了什么问题(希望完成作业),我开始探索是否其为nullptr,便完全通过new构造了一个三维数组并存入i,再顺序输出,发现完全采用new是可以正常构造出三维数组的,见下图:(此时三维数组可以顺利创建,蓝框仅标记疑问点)
进一步的,通过采用逐步调试的方法、完全使用malloc、calloc等C库函数开辟空间,并查看此时的内存情况,发现此时程序可正常执行完并实现输出,但监视器并不能读取三维数组内的内容,可以肯定的是此时其不为nullptr,见下图:
但为什么new与malloc等函数不能通用呢?期待大佬们的指点解答,谢谢!
你把new和malloc交叉用你们老师不打你吗?new[]返回的内存前面藏了数组长度的,而且,也没人规定new的底层会调用malloc。
驻阿联酋的比亚迪店面也许因为某种原因替您维修了一辆小鹏。
但是您不能理直气壮地到随便一家比亚迪店要求人家保修你的小鹏。
刚才在vc2008上试了下,是可以对 new 的空间进行 realloc() 的,内存块被挪移了;代码和运行结果截图如下:
#include "stdio.h"
#include "stdlib.h"
int main()
{
int *p_i = new int [16];
int *p2, *p3;
int i;
p2 = p_i;
for (i = 0; i < 16; i++)
*p2++ = i+1;
p3 = p_i;
for (i = 0; i < 16; i++)
printf("%08x:%d\n",p_i, *p_i++);
p2 = (int *)malloc(16);
printf("p2=malloc()=%08x\n", p2);
p2 = (int *)realloc(p2, 256);
printf("p2=remalloc(256)=%08x\n", p2);
p_i = (int *)realloc(p3, 512);
printf("p_i=remalloc(512)=%08x\n", p_i);
p3 = p_i;
for (i = 0; i < 16; i++)
printf("%08x:%d\n",p_i, *p_i++);
getchar();
return 0;
} // main()
c/c++多维数组也是一维连续存储,所以你定义的三维指针没有必要一层一层去malloc。
给你个例子,我这里拿二维数组来举例
typedef int mat[2][2];
int main()
{
mat* y=(int (*)[2][2])malloc(sizeof(int)*4);
*y[1][1]=100;
}