如何在C语言中释放三维指针内存
最近我对学习UNIX系统编程很感兴趣,我遇到了一个关于三维指针内存释放的问题,如何释放内存以避免内存泄漏。我想在main()函数中释放内存,但我不知道如何修复它,因为我不太熟悉c三维指针,也不知道如何在makeargv()中释放“char*t”。非常感谢 代码如下:如何在C语言中释放三维指针内存,c,pointers,C,Pointers,最近我对学习UNIX系统编程很感兴趣,我遇到了一个关于三维指针内存释放的问题,如何释放内存以避免内存泄漏。我想在main()函数中释放内存,但我不知道如何修复它,因为我不太熟悉c三维指针,也不知道如何在makeargv()中释放“char*t”。非常感谢 代码如下: int makeargv(const char *s, const char *delimiters, char ***argvp) { int error; int i; int numtokens;
int makeargv(const char *s, const char *delimiters, char ***argvp) {
int error;
int i;
int numtokens;
const char *snew;
char *t;
if ((s == NULL) || (delimiters == NULL) || (argvp == NULL)) {
errno = EINVAL;
return -1;
}
*argvp = NULL;
snew = s + strspn(s, delimiters); /* snew is real start of string */
if ((t = malloc(strlen(snew) + 1)) == NULL)
return -1;
strcpy(t, snew);
numtokens = 0;
if (strtok(t, delimiters) != NULL) /* count the number of tokens in s */
for (numtokens = 1; strtok(NULL, delimiters) != NULL; numtokens++) ;
/* create argument array for ptrs to the tokens */
if ((*argvp = malloc((numtokens + 1)*sizeof(char *))) == NULL) {
error = errno;
free(t);
errno = error;
return -1;
}
/* insert pointers to tokens into the argument array */
if (numtokens == 0)
free(t);
else {
strcpy(t, snew);
**argvp = strtok(t, delimiters);
for (i = 1; i < numtokens; i++)
*((*argvp) + i) = strtok(NULL, delimiters);
}
*((*argvp) + numtokens) = NULL; /* put in final NULL pointer */
return numtokens;
}
int main(int argc, char *argv[]) {
char delim[] = " \t";
int i;
char **myargv;
int numtokens;
if (argc != 2) {
fprintf(stderr, "Usage: %s string\n", argv[0]);
return 1;
}
if ((numtokens = makeargv(argv[1], delim, &myargv)) == -1) {
fprintf(stderr, "Failed to construct an argument array for %s\n", argv[1]);
return 1;
}
printf("The argument array contains:\n");
for (i = 0; i < numtokens; i++)
printf("%d:%s\n", i, myargv[i]);
return 0;
}
int makeargv(常量字符*s,常量字符*分隔符,字符***argvp){
整数误差;
int i;
国际努姆托克斯;
const char*snew;
char*t;
if((s==NULL)| |(分隔符==NULL)| |(argvp==NULL)){
errno=EINVAL;
返回-1;
}
*argvp=NULL;
snew=s+strspn(s,分隔符);/*snew是字符串的真正开始*/
如果((t=malloc(strlen(snew)+1))==NULL)
返回-1;
strcpy(t,snew);
numtokens=0;
if(strtok(t,分隔符)!=NULL)/*计算s中的令牌数*/
for(numtokens=1;strtok(NULL,分隔符)!=NULL;numtokens++);
/*为令牌的PTR创建参数数组*/
if(*argvp=malloc((numtokens+1)*sizeof(char*))==NULL){
error=errno;
自由(t);
errno=错误;
返回-1;
}
/*在参数数组中插入指向标记的指针*/
如果(numtokens==0)
自由(t);
否则{
strcpy(t,snew);
**argvp=strtok(t,分隔符);
对于(i=1;i
您好,这里介绍如何完全释放整个三维指针
#include <stdlib.h>
void my_free_t3d(char ***tab)
{
int second_pointer;
int first_pointer;
first_pointer = 0;
while (tab[first_pointer] != NULL)
{
second_pointer = 0;
while (tab[first_pointer][second_pointer] != NULL)
{
free(tab[first_pointer][second_pointer]);
second_pointer++;
}
free(tab[first_pointer]);
first_pointer++;
}
free(tab);
}
#包括
作废我的免费标签(字符***标签)
{
int第二个指针;
int第一个指针;
第一个指针=0;
while(制表符[第一个指针]!=NULL)
{
第二个指针=0;
while(制表符[第一个指针][第二个指针]!=NULL)
{
自由(制表符[第一个指针][第二个指针]);
第二个指针++;
}
自由(制表符[第一个指针]);
第一个指针++;
}
免费(标签);
}
我将把我使用的方法添加到mallocat3d中,这样我们就可以看到这个自由函数背后的逻辑
int main()
{
char ***tab;
int i = 0;
int j = 0;
//I don't check malloc return values just for the example so it's more clear.
tab = malloc(sizeof(char **) * 10);
while (i < 10)
{
j = 0;
tab[i] = malloc(sizeof(char *) * 10);
while (j < 10)
{
tab[i][j] = malloc(sizeof(char) * 10);
j++;
}
i++;
}
my_free_t3d(tab); //Here's our memory freeing function
return 0;
}
intmain()
{
字符***选项卡;
int i=0;
int j=0;
//我不检查malloc返回值,只是为了让示例更清楚。
tab=malloc(sizeof(char**)*10);
而(i<10)
{
j=0;
tab[i]=malloc(sizeof(char*)*10);
而(j<10)
{
表[i][j]=malloc(sizeof(char)*10);
j++;
}
i++;
}
my_free_t3d(tab);//这是我们的内存释放函数
返回0;
}
所以基本上我只是开始释放分配给字符串的空间(包含在tab**)。然后删除分配给二维指针(tab*)的空间,然后释放分配给三维指针(tab)的空间。例如,如果您不按该顺序释放,直接释放tab,您将无法访问tab[I]或tab[I][J],但它们的内存仍将被分配。
希望它对您的计划有所帮助。欢迎使用SO。你写道:“我不知道如何修复它,因为我对c不太熟悉。”。在这种情况下,您可能应该从一些(事实上相当多)教程开始,并获得一些关于您所问问题的基本知识。这不是一个教程,也不是一个代码编写服务。我在我的大学里学过C编程,但很长一段时间后,我忘记了一些特性,我会再次学习,谢谢。这都是非常可怕的编程实践。这真的不是你应该学习的东西。他们之所以使用3级间接寻址,是因为他们希望通过参数列表返回指向指针的指针。然而,这被广泛认为是不好的做法,讽刺地称为“三星编程”。通常有更好的方法来实现同样的结果,比如使用结构数组。关于这个主题的相关阅读:。简单而有效,尽管我想补充一点,
while(something!=NULL)
是多余的,你只需要while(something)
cuz C是令人敬畏的,而不是tab[I]=malloc(sizeof(char*) * 10);代码>,考虑<代码>标签[i]=Maloc(SIZOF*(Tab[i])* 10);<代码>。更容易正确编码、检查和维护。@chux哦,是的,我忘记了可以直接调整变量的大小,而不是它的类型,下次我会尽量记住这一点。谢谢。