我有一个指向struct的指针数组,在处理完数组后,指针位于内存块的末尾。我想释放内存块,所以我需要转到第一个内存字节并再次循环遍历指针数组以释放数组中的每个元素。你会如何指回内存块的第一个字节?
答案 0 :(得分:6)
你必须要么记住原始地址,要么知道你在哪里(索引是什么),这样你就可以备份到足以找到起点。
第一个例子(暂时忽略,在所有这些情况下,你打印未初始化的值,毕竟它是人为的示例):
int *ip = malloc (10 * sizeof (*ip));
int *origIp = ip;
printf ("%d\n", *ip++); // print and advance
printf ("%d\n", *ip++); // print and advance
ip = origIp; free (ip); // or just free (origIp) if you wish.
第二个:
int *ip = malloc (10 * sizeof (*ip));
int idx = 0;
printf ("%d\n", *ip++); idx++; // print and advance
printf ("%d\n", *ip++); idx++; // print and advance
ip -= idx; free (ip);
或者,您可以保持指针不变,并使用数组索引来处理数组,如:
int *ip = malloc (10 * sizeof (*ip));
int idx = 0;
printf ("%d\n", ip[idx++]); // print and advance
printf ("%d\n", ip[idx++]); // print and advance
free (ip);
无论如何,大多数现代编译器都会为您提供相同的代码。
答案 1 :(得分:5)
没有自动方式 - 您必须将原始位置传递给免费。
常用技巧是制作原始指针的副本,或者如果你知道条目的数量及其大小,你可以从指针中减去它