阁龙1427 发表于 2016-3-17 13:22:56

关于数组和malloc

最近比较困惑一个问题就是我们申请一个数组时,是否需要申请一个空间给他呢?

比如:

#define maxsize100;

int array;

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

musilintan 发表于 2016-3-17 13:22:57

int array 本身已经具备内存空间,不需要再次分配。
int* array = (int*)malloc(maxsize) 这种方式为动态分配内存。
这两种方式都可以,完全是按照实际算法来决定倒地最后用哪一种。静态的变量省去了分配空间的时间,在大量循环的时候比较适合使用,而且静态的不需要考虑释放内存的问题,所以变成一般都会用静态的int array。
    除非是涉及到变量生命周期,需要在其他的地方使用变量,那样只能动态分配内存,这样变量才能被灵活的在各个地方调用。
    静态int array和动态int* array=(int*)malloc(maxsize)的最重要的区别就是存在范围和周期。按照不同的需求,设计不同的算法就好。一般局部变量尽量使用静态的,会比动态的效率高。

阴影中的曙光 发表于 2016-3-17 14:31:43

不用

Angel丶L 发表于 2016-3-17 14:37:10

目测代码写错了

阁龙1427 发表于 2016-3-17 14:47:11

Angel丶L 发表于 2016-3-17 14:37
目测代码写错了

弱弱的问一句:错在哪里?

爱上她_不过一场 发表于 2016-3-19 22:09:14

如果你能确定所需大小的话,可以直接指定大小,这时候编译器会根据你的值自动分配,如果你不知道的话,可以在堆里面申请所需空间,动态的申请空间,定义一个需要的结构体类型就行了,用一个申请一个,简单方便,用完记得释放空间就行了,看看结构体,很简单的!!!加油!!!共同学习!!!

爱上她_不过一场 发表于 2016-3-19 22:10:26

如果你能确定所需大小的话,可以直接指定大小,这时候编译器会根据你的值自动分配,如果你不知道的话,可以在堆里面申请所需空间,动态的申请空间,定义一个需要的结构体类型就行了,用一个申请一个,简单方便,用完记得释放空间就行了,看看结构体,很简单的!!!加油!!!共同学习!!!

阁龙1427 发表于 2016-3-21 09:52:02

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

可以理解为结构体的内存空间是在堆上申请,而数组的空间是声明的时候就在栈上分配了是否正确?
因为栈是存放局部变量的,所以在subroutine里面去用的时候就自动在栈上分配内存给他们?

fzquchs 发表于 2016-3-21 10:02:00

局部变量是由栈存放的,malloc分配的是堆空间。 一般定义指针变量才分配一块堆内存给它用!

n0noper 发表于 2016-3-21 10:07:52

栈数组:
int array;

堆数组:
int *a = new int;

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

楼上的说法都很好,补充补充~~~

ryxcaixia 发表于 2016-3-21 13:35:39

无法将int转成int*

ryxcaixia 发表于 2016-3-21 13:35:51

无法从“int *”转换为“int

爱上她_不过一场 发表于 2016-3-24 08:06:24

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

可以勉强这么理解

atmo 发表于 2016-3-24 08:39:52

要构成动态数组才需要申请空间.

flyskyltq 发表于 2016-5-27 09:57:36

不必要,因为你已经设置为了定长数组,长度为100,内存分配的空间大小为100*4,使用malloc()应该不会错,但是没必要。如果你定义一个不定长数组,int arry[],后来知道了数组长度,应该使用malloc()函数分配内存空间。

Krant5 发表于 2016-8-5 15:40:18

int a就代表在栈中开辟了maxsize个int大小的空间,并不需要malloc,另外malloc开辟的空间在堆中,需要手动释放,前者就不用

18813974736 发表于 2016-9-9 12:32:07

#define maxsize 100;

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

array = (int *)malloc(maxsize);//——数组名是首元素地址;它是常量不可赋值;

Average. 发表于 2016-9-10 14:48:13

按这种申明方式的话是不需要你的第三行代码的,因为你在申明int array时,编译器就自动给你申请了数组所需的内存。但如果时需要动态控制数组大小,也就是说需要一个动态数组的话(长度由用户输入),就需要用malloc来申请相应的内存空间了。

Damn_it 发表于 2016-9-13 23:21:53

不用
页: [1]
查看完整版本: 关于数组和malloc