如何在C语言中释放三维指针内存

如何在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;

最近我对学习UNIX系统编程很感兴趣,我遇到了一个关于三维指针内存释放的问题,如何释放内存以避免内存泄漏。我想在main()函数中释放内存,但我不知道如何修复它,因为我不太熟悉c三维指针,也不知道如何在makeargv()中释放“char*t”。非常感谢

代码如下:

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哦,是的,我忘记了可以直接调整变量的大小,而不是它的类型,下次我会尽量记住这一点。谢谢。