鱼C论坛

 找回密码
 立即注册
查看: 4425|回复: 18

[技术交流] 关于数组和malloc

[复制链接]
发表于 2016-3-17 13:22:56 | 显示全部楼层 |阅读模式
1鱼币
最近比较困惑一个问题就是我们申请一个数组时,是否需要申请一个空间给他呢?

比如:

#define maxsize  100;

int array[maxsize];

array = (int*)malloc(maxsize);// 这句是否是必要的?

最佳答案

查看完整内容

int array[maxsize] 本身已经具备内存空间,不需要再次分配。 int* array = (int*)malloc(maxsize) 这种方式为动态分配内存。 这两种方式都可以,完全是按照实际算法来决定倒地最后用哪一种。静态的变量省去了分配空间的时间,在大量循环的时候比较适合使用,而且静态的不需要考虑释放内存的问题,所以变成一般都会用静态的int array[maxsize]。 除非是涉及到变量生命周期,需要在其他的地方使用变量,那样只能动态分配内存 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-17 13:22:57 | 显示全部楼层
int array[maxsize] 本身已经具备内存空间,不需要再次分配。
int* array = (int*)malloc(maxsize) 这种方式为动态分配内存。
这两种方式都可以,完全是按照实际算法来决定倒地最后用哪一种。静态的变量省去了分配空间的时间,在大量循环的时候比较适合使用,而且静态的不需要考虑释放内存的问题,所以变成一般都会用静态的int array[maxsize]。
    除非是涉及到变量生命周期,需要在其他的地方使用变量,那样只能动态分配内存,这样变量才能被灵活的在各个地方调用。
    静态int array[maxsize]和动态int* array=(int*)malloc(maxsize)的最重要的区别就是存在范围和周期。按照不同的需求,设计不同的算法就好。一般局部变量尽量使用静态的,会比动态的效率高。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-17 14:31:43 | 显示全部楼层
不用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-17 14:37:10 | 显示全部楼层
目测代码写错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-3-17 14:47:11 | 显示全部楼层

弱弱的问一句:错在哪里?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-19 22:09:14 | 显示全部楼层
如果你能确定所需大小的话,可以直接指定大小,这时候编译器会根据你的值自动分配,如果你不知道的话,可以在堆里面申请所需空间,动态的申请空间,定义一个需要的结构体类型就行了,用一个申请一个,简单方便,用完记得释放空间就行了,看看结构体,很简单的!!!加油!!!共同学习!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-19 22:10:26 | 显示全部楼层
如果你能确定所需大小的话,可以直接指定大小,这时候编译器会根据你的值自动分配,如果你不知道的话,可以在堆里面申请所需空间,动态的申请空间,定义一个需要的结构体类型就行了,用一个申请一个,简单方便,用完记得释放空间就行了,看看结构体,很简单的!!!加油!!!共同学习!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-3-21 09:52:02 | 显示全部楼层
爱上她_不过一场 发表于 2016-3-19 22:10
如果你能确定所需大小的话,可以直接指定大小,这时候编译器会根据你的值自动分配,如果你不知道的话,可以 ...

可以理解为结构体的内存空间是在堆上申请,而数组的空间是声明的时候就在栈上分配了是否正确?
因为栈是存放局部变量的,所以在subroutine里面去用的时候就自动在栈上分配内存给他们?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-21 10:02:00 From FishC Mobile | 显示全部楼层
局部变量是由栈存放的,malloc分配的是堆空间。 一般定义指针变量才分配一块堆内存给它用!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-21 10:07:52 | 显示全部楼层
栈数组:
int array[100]; 

堆数组:
int *a = new int[100];

就像3楼说的,撸主的代码是错误的。定义的栈数组,然后malloc申请堆空间,想int*类型转换为int[]类型,就错了。
我们通常说的数组,都是栈数组,定义一个定长数组,编译器就已经把空间申请完毕了,不需要另外申请空间;malloc分配的是堆空间,这个是可以自己申请的,不定长,可以realloc继续继续,这个比定长数组更加灵活。

楼上的说法都很好,补充补充~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-21 13:35:39 | 显示全部楼层
无法将int[100]转成int*
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-21 13:35:51 | 显示全部楼层
无法从“int *”转换为“int [100]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-24 08:06:24 | 显示全部楼层
阁龙1427 发表于 2016-3-21 09:52
可以理解为结构体的内存空间是在堆上申请,而数组的空间是声明的时候就在栈上分配了是否正确?
因为栈是 ...

可以勉强这么理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-24 08:39:52 | 显示全部楼层
要构成动态数组才需要申请空间.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-5-27 09:57:36 | 显示全部楼层
不必要,因为你已经设置为了定长数组,长度为100,内存分配的空间大小为100*4,使用malloc()应该不会错,但是没必要。如果你定义一个不定长数组,int arry[],后来知道了数组长度,应该使用malloc()函数分配内存空间。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-5 15:40:18 | 显示全部楼层
int a[maxsize]就代表在栈中开辟了maxsize个int大小的空间,并不需要malloc,另外malloc开辟的空间在堆中,需要手动释放,前者就不用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-9 12:32:07 | 显示全部楼层
#define maxsize 100;

int array[maxsize];//执行到这句代码时编译器已自动分配 maxsize * int 个字节给这个数组了

array = (int *)malloc(maxsize);//——数组名是首元素地址;它是常量不可赋值;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-10 14:48:13 | 显示全部楼层
按这种申明方式的话是不需要你的第三行代码的,因为你在申明int array[maxsize]时,编译器就自动给你申请了数组所需的内存。但如果时需要动态控制数组大小,也就是说需要一个动态数组的话(长度由用户输入),就需要用malloc来申请相应的内存空间了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-13 23:21:53 | 显示全部楼层
不用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 03:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表