数组的宣言
数组的声明
1.
char (*ptr)[64] = new char[n][64];
2.
char **ptr = new char*[n];
for(int i = 0; i < n; ++i)
{
ptr[i] = new char[64];
}
请教这两种方式的区别,从效率、空间、位置等各个方面谈谈,看看谁说得最透彻,谢谢。
顺便我还有三个帖子没有结,麻烦过去随便回复一下,我也好得一半的分。
------解决方案--------------------
1) ptr ---->【n】【64】 一个指针,n*64 个一次分配,空间
栈上(或者全局变量区)一个指针的空间,(好吧也可能是堆上),
+堆上 >n*64 个元素的空间
2)ptr---->【n】 1+ n个指针 1 + n 次分配
--> ptr[0]--->【64】
。。。。。。
ptr[i]---->【64】
。。。。。。。。
ptr[n-1]---->【64】
栈上1个指针 + 堆上 > n个指针 的空间 + > n*64 个元素的空间
小小的区别:
第一种方式,有利于分配大块内存,内存碎片少,
内存耗尽时,可以很简单的正常退出。
第二种方式,小块可分配内存多的时候更有利,占用内存略多一点。
但是内存碎片多,当内存耗尽的时候,
正常退出处理比较麻烦。
总的来说,区别不大。
差距很小
1.
char (*ptr)[64] = new char[n][64];
2.
char **ptr = new char*[n];
for(int i = 0; i < n; ++i)
{
ptr[i] = new char[64];
}
请教这两种方式的区别,从效率、空间、位置等各个方面谈谈,看看谁说得最透彻,谢谢。
顺便我还有三个帖子没有结,麻烦过去随便回复一下,我也好得一半的分。
------解决方案--------------------
1) ptr ---->【n】【64】 一个指针,n*64 个一次分配,空间
栈上(或者全局变量区)一个指针的空间,(好吧也可能是堆上),
+堆上 >n*64 个元素的空间
2)ptr---->【n】 1+ n个指针 1 + n 次分配
--> ptr[0]--->【64】
。。。。。。
ptr[i]---->【64】
。。。。。。。。
ptr[n-1]---->【64】
栈上1个指针 + 堆上 > n个指针 的空间 + > n*64 个元素的空间
小小的区别:
第一种方式,有利于分配大块内存,内存碎片少,
内存耗尽时,可以很简单的正常退出。
第二种方式,小块可分配内存多的时候更有利,占用内存略多一点。
但是内存碎片多,当内存耗尽的时候,
正常退出处理比较麻烦。
总的来说,区别不大。
差距很小