【发布时间】:2021-02-17 02:08:25
【问题描述】:
如何释放一个指针数组,其中每个指针指向我在函数内部分配的字符串的地址?
我在main 中创建了一个简单的指针数组*pointers[],并将它传递给readline,它会返回我已阅读的行数。
这样做的目的是存储由'\n'分隔的输入的所有行。每行存储在指针数组中的一个指针中。
所以在调用readline 并返回后,我可以printf("%s", pointers[0]) 显示用户输入的第一行。
我为数组中的每个指针分配一行的方式是在readline 内部,方法是分配一个char 指针*p,使其具有MAXLENGTH 大小并将p 的当前地址传递给相应的指针。每次赋值完成后,我跳转到下一个空闲地址p。
最后,我的问题是,在 readline 例程完成并打印所有存储的行之后,我是否必须释放(以及如何)我的指针数组。
我将把main 和readline 这两个函数留给你。
#define NUMOFLINES 5
#define MAXLENGTH 1000
void main(void) {
char *pointers[NUMOFLINES]; // Array of pointers to string
int nlines; // Number of pointers read
nlines = readlines(pointers);
writelines(pointers, nlines);
/* FAILED ATTEMPT TO FREE THE ARRAY OF POINTERS */
for(int i = 0 ; i < nlines ; i++)
free(pointers[i]);
}
int readlines(char *pointers[]) {
char line[MAXLENGTH];
char *p;
int iptr, len;
/* ALLOCATE P */
p = malloc(sizeof(char) * MAXLENGTH);
for(iptr = 0 ; iptr < NUMOFLINES && (len = get_line(line)) > 0 ; iptr++)
{
strcpy(p, line); // copy the line to the array, ending in len-th position
pointers[iptr] = p; // Pass current adress 'p' to the respectively index of pointers
p += len+1; // Next free adress in array p
}
return iptr;
}
如你所见,我试图通过遍历每个指针并调用 free(pointer[i] 来释放,但我得到的只是
malloc(): corrupted top size
Aborted (core dumped)
我需要打电话给free吗?
提前致谢。
【问题讨论】:
-
malloc()在循环外完成一次。但是您正在免费使用NUMOFLINES倍。我也不太明白p += len+1;的目的。 -
我编辑了这个问题,解释说在我得到一行后,我将该行存储在数组内的指针中,然后通过执行
p = len+1跳转到p内的下一个可用空间。请注意,len来自“length”,即输入行的长度。p这里只是一种缓冲区,我存储了由\0分隔的所有行。它可能不是完美的代码,我知道,但只是为了练习,因为我还在学习要领。 -
只做
if ( nlines > 0 ) free(pointers[0]);而不是循环。在函数中,您还应该检查不超过分配的空间大小 -
你能澄清你的答案吗?如果我这样做
free(pointers[0])它会释放所有指针? -
@spiazzy
free释放内存块,而不是指针本身。你只有一个内存块。