关于数组和malloc
最近比较困惑一个问题就是我们申请一个数组时,是否需要申请一个空间给他呢?比如:
#define maxsize100;
int array;
array = (int*)malloc(maxsize);// 这句是否是必要的? int array 本身已经具备内存空间,不需要再次分配。
int* array = (int*)malloc(maxsize) 这种方式为动态分配内存。
这两种方式都可以,完全是按照实际算法来决定倒地最后用哪一种。静态的变量省去了分配空间的时间,在大量循环的时候比较适合使用,而且静态的不需要考虑释放内存的问题,所以变成一般都会用静态的int array。
除非是涉及到变量生命周期,需要在其他的地方使用变量,那样只能动态分配内存,这样变量才能被灵活的在各个地方调用。
静态int array和动态int* array=(int*)malloc(maxsize)的最重要的区别就是存在范围和周期。按照不同的需求,设计不同的算法就好。一般局部变量尽量使用静态的,会比动态的效率高。 不用
目测代码写错了 Angel丶L 发表于 2016-3-17 14:37
目测代码写错了
弱弱的问一句:错在哪里? 如果你能确定所需大小的话,可以直接指定大小,这时候编译器会根据你的值自动分配,如果你不知道的话,可以在堆里面申请所需空间,动态的申请空间,定义一个需要的结构体类型就行了,用一个申请一个,简单方便,用完记得释放空间就行了,看看结构体,很简单的!!!加油!!!共同学习!!! 如果你能确定所需大小的话,可以直接指定大小,这时候编译器会根据你的值自动分配,如果你不知道的话,可以在堆里面申请所需空间,动态的申请空间,定义一个需要的结构体类型就行了,用一个申请一个,简单方便,用完记得释放空间就行了,看看结构体,很简单的!!!加油!!!共同学习!!! 爱上她_不过一场 发表于 2016-3-19 22:10
如果你能确定所需大小的话,可以直接指定大小,这时候编译器会根据你的值自动分配,如果你不知道的话,可以 ...
可以理解为结构体的内存空间是在堆上申请,而数组的空间是声明的时候就在栈上分配了是否正确?
因为栈是存放局部变量的,所以在subroutine里面去用的时候就自动在栈上分配内存给他们? 局部变量是由栈存放的,malloc分配的是堆空间。 一般定义指针变量才分配一块堆内存给它用! 栈数组:
int array;
堆数组:
int *a = new int;
就像3楼说的,撸主的代码是错误的。定义的栈数组,然后malloc申请堆空间,想int*类型转换为int[]类型,就错了。
我们通常说的数组,都是栈数组,定义一个定长数组,编译器就已经把空间申请完毕了,不需要另外申请空间;malloc分配的是堆空间,这个是可以自己申请的,不定长,可以realloc继续继续,这个比定长数组更加灵活。
楼上的说法都很好,补充补充~~~ 无法将int转成int* 无法从“int *”转换为“int 阁龙1427 发表于 2016-3-21 09:52
可以理解为结构体的内存空间是在堆上申请,而数组的空间是声明的时候就在栈上分配了是否正确?
因为栈是 ...
可以勉强这么理解 要构成动态数组才需要申请空间. 不必要,因为你已经设置为了定长数组,长度为100,内存分配的空间大小为100*4,使用malloc()应该不会错,但是没必要。如果你定义一个不定长数组,int arry[],后来知道了数组长度,应该使用malloc()函数分配内存空间。 int a就代表在栈中开辟了maxsize个int大小的空间,并不需要malloc,另外malloc开辟的空间在堆中,需要手动释放,前者就不用 #define maxsize 100;
int array;//执行到这句代码时编译器已自动分配 maxsize * int 个字节给这个数组了
array = (int *)malloc(maxsize);//——数组名是首元素地址;它是常量不可赋值; 按这种申明方式的话是不需要你的第三行代码的,因为你在申明int array时,编译器就自动给你申请了数组所需的内存。但如果时需要动态控制数组大小,也就是说需要一个动态数组的话(长度由用户输入),就需要用malloc来申请相应的内存空间了。 不用
页:
[1]