C/C++如何分配未知长度的数组的内存空间?动态内存分配?

比如有两个数组(假设是int类型),我需要找到他们的公共元素,放入第三个数组,但是我之前是不知道有多少个公共元素,为了不浪费内存我准备用 int* array_c = new int;
程序编译运行都没问题,但是提示
*** glibc detected *** ./findsame: free(): invalid next size (fast): 0x08222008 ***
======= Backtrace: =========
/lib/libc.so.6(+0x6c501)[0x267501]
/lib/libc.so.6(+0x6dd70)[0x268d70]
/lib/libc.so.6(cfree+0x6d)[0x26be5d]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0x1ba441]
./findsame[0x80489b6]
/lib/libc.so.6(__libc_start_main+0xe7)[0x211ce7]
./findsame[0x8048691]
======= Memory map: ========
00110000-001ef000 r-xp 00000000 08:07 1534298 /usr/lib/libstdc++.so.6.0.14
001ef000-001f3000 r--p 000de000 08:07 1534298 /usr/lib/libstdc++.so.6.0.14
怎么回事?

如果不想浪费内存。建议LZ试一下这个函数:calloc(),或者malloc(),他们被包含在stdlib.h的头文件里面。以下是具体步骤:

1.首先,因为你不知道两个所要对比的数的公共元素个数,可以先设置一个标记标量k,并初始化为0,每当两个数组有元素相等时就把标记变量的值加一。(使用for循环实现,不用细说了吧)

2.定义一个int类型的指针变量a(int *a),因为要开辟内存。然后使用以下命令:
a = calloc(k, sizeof(int));
或者
a = malloc(k,sizeof(int));
两个函数唯一的区别就是第一个函数将开辟的内存空间初始化为0,而malloc却没有。

3.然后你就可以把公共元素存入到这个行开辟的内存空间中来(这个也不用多说了吧)

4.当你的程序任务完成以后,记得释放你所开辟的内存空间,使用这个命令:free(a)追问

这个确实可行,不过似乎不需要k,即使设为int* a = (int*) calloc(1,sizeof(int));
也可以,这是怎么回事啊?

追答

最好不要这样,这样你存放元素时是存放在没有开辟的内存空间中,也许有时会是正确的,不过对系统会有损伤。这好比把一系列字符常量赋值给一个char 类型的指针变量时不加'\0',有时也会使用正确,不过最好还是不要采取这种做法

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-08-08
你想分配一个整数数组,没有长度是不行的,其实你可以先给一个比较小长度的size,在以后的操作过程中,先判断当前数组长度是否已经满了,如果满了,则再分配更长长度的空间,并将以前的数组内容拷到新的空间里,其实就是vector的实现方式,你或者也可以使用list的实现方式追问

明白了,主要是不明白为啥程序可以运行,但就是有提示。

第2个回答  2011-08-08
如果是分配问题,你可以将第三个数组多分点,与前两个数组中较长那数组一样大就行、追问

就是不想浪费内存。

第3个回答  2011-08-08
第三个数组,如果是预先分配,至少要与两个数组中的较短数组的长度相同(最坏情况是较短数组的所有元素都是公共元素)。

如果不希望预先分配那么多内存
1. 如果是C++,用vector。
2. 如果是C,考虑用链表。单/双链表皆可。需要自己实现。也可一开始分配长度为1的数组,往里填充,满了后重建一长度为2的数组,继续填充。每次满了就将老数组长度加倍,建造新数组。你得自己写函数实现,不难,不过效率不高。
第4个回答  2011-08-08
做成一个链表,找到一个就插入,很节省空间。
相似回答