user-0 提问: 关于动态分配数组哒问题哈

回复:
user: user-1
content: for reference only,code for c99 only;#include <stdio.h>  int main(void) { 	// your code goes here 	int n,m; 	scanf("%d%d",&n,&m); 	int a[m][n]; 	return 0; }

user: user-0
content: 其实  其实这样想的   也可以不是数组   就是数组那种样式吧   先不定义他的大小  也可以指定（尽量小）（只要后面能改）   就是用户输入一个数   不够的话   我就延长一下  只要后面能连续访问与操作

user: user-0
content: 麻麻的问一句   那个效率啥的    我感觉要是动态分配数组元素的话    效率应该高高达     还有就是感谢各位大神   小弟新手   还请多多关照哈！！！

user: user-0
content: 麻麻的问一句   那个效率啥的    我感觉要是动态分配数组元素的话    效率应该高高达     还有就是感谢各位大神   小弟新手   还请多多关照哈！！！

user: user-2
content: 上个帖你没给本帅分，本来不准备理你，但本帅闲得无聊，况且回答别人也能温故而知新…… 你是个傻瓜，连数组是啥都不知道就做数组的题目…… 数组要求连续分配，你那个malloc不能保证。N1570，An array type describes a contiguously allocated nonempty set of objects with a particular member object type, called the element type.

user: user-3
content: 你要输进去之前，你在先确保有空间可以放。。所以无论如何你都得先确定数组有空间，你输一个，再开一个空间.那不是要先判断你输了数据没，然后把这个数据放到一个临时的空间中，然后再对原动态数组进行释放(当然这中间要把原来的数据暂时保存)，然后再动态创建原来同名的空间，把空间加1。再把所有的输入的数据考进去。。。我想到的就是这个法子了。VECTOR大概就是这原理了，但是你怎么说都是事先开一些空间的

user: user-4
content: malloc，realloc，free

user: user-5
content: 可以的用malloc/free函数，参考http://blog.csdn.net/pearl333/article/details/8609703

user: user-6
content: new 和 malloc都可以实现

user: user-7
content: 数组在使用之前必须是空间分配好的，不能做到添加一个元素就增加一个空间，除非你重新分配空间并作数据拷贝。 对于这样的需求，可以使用链表。

user: user-2
content: 支持赵老湿，乌拉！！

user: user-4
content: 无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！

user: user-8
content: 引用 楼主 feastwin 的回复:看了一下问上的资源，关于动态分配数组好像就是可以用完以后就清除，就算动态，我傻傻的想了一下，可不可以“动态”数组大小，就是用户输一个，我就开一个数据单元，如此如此，可否？？？   求大神！ 可以！ 使用malloc realloc，free，但是效率会比较底下，而且涉及到原数组的释放，以及原数组元素复制到新数组的问题。 你可以直接使用vector。他就不比那么麻烦了，你可以百度一下。

user: user-2
content: 声明：以下内容，同写代码又臭又长的赵老湿切磋一下。  给定声明： int * * p; 则p是指向“指向int类型的指针”的指针。 可以动态创建一个数组，令p指向它的首元素。但是，这个数组的元素类型必须是int * ： p = (int * *) malloc (sizeof (int *) * ROWS); 那么，如何利用p访问这个数组的每一个元素呢（比如，将它的每个元素都赋NULL指针）？ 第一种方法是利用指针运算的规则： for (int i = 0; i < ROWS; i ++)     * (p + i) = NULL; 第二种方法是利用“在某些情况下，数组和指向它首元素的指针等价”： for (int i = 0; i < ROWS; i ++)     p [i] = NULL; 第三种方法也是利用数组下标运算，但是要先将p从“指向数组首元素的指针”转化为“指向一个数组的指针”： int * (*q) [] = (int * (*) []) p; for (int i = 0; i < ROWS; i ++)     (* q) [i] = NULL; 以上，声明q为指向数组的指针，然后将p转化为指向数组的指针，赋给q。当q解引用（*q）后，就得到一个数组，这时就可以利用下标来访问数组的每一个元素了。考虑到在某些情况下，数组和指向它首元素的指针等价，故上述代码也可以写成： int * (*q) [] = (int * (*) []) p; for (int i = 0; i < ROWS; i ++)     * ((* q) + i) = NULL;  前面那个动态创建的数组，其元素都是指向int类型的指针，我们已经全部赋值为NULL。如果希望令它们各自指向一个int类型的数组的首元素，怎么办呢？很简单，只需要使用上述四种方法中的一种，将NULL改成 (int *) malloc (sizeof (int) * COLS); 即可。如： for (int i = 0; i < ROWS; i ++)     * (p + i) = (int *) malloc (sizeof (int) * COLS);  最后，我们来看看，如何用前面的四种方法来读写这个奇怪数组的每一个元素。为简单起见，用前两种方法写，用后两种方法读。 写入数据的方法一： for (int i = 0; i < ROWS; i ++)     for (int j = 0; j < COLS; j ++)         * (* (p + i) + j) = j; 写入数据的方法二： for (int i = 0; i < ROWS; i ++)     for (int j = 0; j < COLS; j ++)         p [i] [j] = j; 读出数据的方法一： int * (*q) [] = (int * (*) []) p; for (int i = 0; i < ROWS; i ++)     for (int j = 0; j < COLS; j ++)         {             int (* r) [] = (int (*) [])(* q) [i];  //先将(* q) [i]转化为指向数组的指针             printf("%d\n", (* r) [j]);  //r解引用后是数组，下标j引用它的第j个元素         } 读出数据的方法二： int * (*q) [] = (int * (*) []) p; for (int i = 0; i < ROWS; i ++)     for (int j = 0; j < COLS; j ++)         printf("%d\n", *(* (* q + i) + j));