- 论坛徽章:
- 0
|
原帖由 ccas 于 2006-8-23 18:45 发表
如果我定义了一个数组
int int_ary[3][3]={{1,1,1},
{2,2,2},
{3,3,3}};
现在要把它扩展成 4行4列,
int int_ary[4][4]={{1,1,1,NULL},
{2,2,2,NULL},
{3,3,3,NULL},
{NULL,NULL,NULL,NULL}};
用分配空间的语句(alloc,malloc,remalloc等)要怎么写
我个人认为,你所说的“扩展”这个词的含义,其实很值得推敲。
按你的代码中所表现的意思,应该是指“数组的名称不变,但是大小变化了”,不知道我理解的对不对?
如果是这样的话,那么我觉得任何一个函数恐怕都帮不上忙。
因为无论从堆里还是从栈里重新分配一个buffer,你都无法将这个buffer的首地址赋给已经分配了的数组“int_ary”。因为“int_ary”是不能被作为左值来使用的。也就是说它无法被重新赋值,它永远只能指向初始化时被分配的首地址。
如果你真的想实现“数组的名称不变,但是大小变化”,其实方法也很简单,那就是什么都不用做!
因为C编译器虽然分配了固定内存给数组,但通常并不阻止你使用超过这个数组界限的内存空间。举例如下:
- int i;
- int arr[10];
- for(i=0; i<15; i++) {
- arr[i] = i;
- }
- for(i=0; i<15; i++) {
- printf("%d\n",arr[i]);
- }
复制代码
这个程序是可以编译通过的,而且会按照我们设想的输出。
二维数组和一维一样都是连续的内存空间,所以可以用同样的方法。只不过实现起来会麻烦一些,你可能需要先把原数组的内容拷贝到别的内存空间,然后再按照某种方法拷贝回来并重新组织。
但是从编程的角度来说,上面的方法应该是被摒弃的!原因嘛大家肯定都很清楚,我就不多说了。 |
|