我是一名自学者CS学习者。 (请将我的评论作为极客的查询,以便进一步澄清所需的内容)
我正在撰写一个简单的c脚本,以便更好地了解动态分配内存(除了队列和堆栈)。为此,我创建了一个简单的“malloced”指针,指向“n int type heap memory”。
int *array;
int size = 10;
//point to a chunk of 10 (m)allocated memory in heap (?) am I right ?
array = (int *) malloc(sizeof(int) * size);
现在我对它们做了一些操作。例如
//passing array as reference (?)
void handy_array(int *pointer, int size) {
/*operation on the (m)allocated array of given size created in heap*/
for(int i = 0; i < size; i++) {
pointer[i] = i-10 ;
}
return;
}
到目前为止一切顺利,现在我们可以像char字符串一样使用这个数组[size] [n] =“一个字符串。” 但是在使用这种方法释放内存时
void free_array(int *array, int size) {
for(int i= 0; i < size; i++){
//free the ith assigned address and its value in heap memory
free(&array[i]);
}
return;
}
现在,我收到了这个有趣的错误信息 -
*** Error in `./main': free(): invalid pointer: 0x0973d00c ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x67377)[0xb75f6377]
/lib/i386-linux-gnu/libc.so.6(+0x6d2f7)[0xb75fc2f7]
/lib/i386-linux-gnu/libc.so.6(+0x6dbb1)[0xb75fcbb1]
./main[0x8048590]
./main[0x80484c8]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf7)[0xb75a7637]
./main[0x8048391]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:01 22937845 /directory/to/the/script
08049000-0804a000 r--p 00000000 08:01 22937845 /directory/to/the/script
0804a000-0804b000 rw-p 00001000 08:01 22937845 /directory/to/the/script
0973d000-0975e000 rw-p 00000000 00:00 0 [heap]
b7400000-b7421000 rw-p 00000000 00:00 0
b7421000-b7500000 ---p 00000000 00:00 0
b7559000-b7575000 r-xp 00000000 08:01 13239646 /lib/i386-linux-gnu/libgcc_s.so.1
b7575000-b7576000 rw-p 0001b000 08:01 13239646 /lib/i386-linux-gnu/libgcc_s.so.1
b758f000-b773e000 r-xp 00000000 08:01 13239459 /lib/i386-linux-gnu/libc-2.23.so
b773e000-b773f000 ---p 001af000 08:01 13239459 /lib/i386-linux-gnu/libc-2.23.so
b773f000-b7741000 r--p 001af000 08:01 13239459 /lib/i386-linux-gnu/libc-2.23.so
b7741000-b7742000 rw-p 001b1000 08:01 13239459 /lib/i386-linux-gnu/libc-2.23.so
b7742000-b7745000 rw-p 00000000 00:00 0
b775d000-b7760000 rw-p 00000000 00:00 0
b7760000-b7762000 r--p 00000000 00:00 0 [vvar]
b7762000-b7763000 r-xp 00000000 00:00 0 [vdso]
b7763000-b7785000 r-xp 00000000 08:01 13239455 /lib/i386-linux-gnu/ld-2.23.so
b7785000-b7786000 rw-p 00000000 00:00 0
b7786000-b7787000 r--p 00022000 08:01 13239455 /lib/i386-linux-gnu/ld-2.23.so
b7787000-b7788000 rw-p 00023000 08:01 13239455 /lib/i386-linux-gnu/ld-2.23.so
bf7eb000-bf80c000 rw-p 00000000 00:00 0 [stack]
Aborted (core dumped)
我的确切问题是:
0.这是从全局或局部范围分配内存块的实际做法,或者从主方法启动它们并处理我在这里做的本地方法。
1. 上述场景中释放内存的确切方法是什么?
和
(可选;如果您认为不相关,请忽略)
2.我想要一些提示来理解像回溯和内存映射这样有趣的错误消息
提前致谢
答案 0 :(得分:2)
首先,您不需要在以下语句中强制转换malloc()
的返回值:
array = (int *) malloc(sizeof(int) * size);
//instead use:
array = malloc(sizeof(*array) * size);
//this is fine and here `*array` instead of `int` to denote the type
原因如下:https://stackoverflow.com/a/605858/5281962
解决您的问题,您只需要将malloc
ed指针释放一次,而是通过在{{free()
中使用for
而不止一次在您的free_array()
函数
for(int i= 0; i < size; i++){
//free the ith assigned address and its value in heap memory
free(&array[i]);
}
而不是循环只做:
free(array); //done!