如何在C

时间:2017-09-19 09:40:00

标签: c pointers

最近我有兴趣学习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;
}

1 个答案:

答案 0 :(得分:1)

你好,这里是如何完全释放整个三维指针

#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);
 }

我将添加我用于malloc t3d的方式,以便我们可以看到这个自由函数背后的逻辑。

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;
}

所以基本上我只是开始释放为字符串分配的空间(包含在tab **中)。然后我删除为2维指针(tab *)分配的空间,然后释放为3维指针(tab)分配的空间。

如果您不按该顺序释放并且您直接释放标签,例如,您将无法访问标签[I]或标签[I] [J],但仍会分配其内存。  
希望它对你的计划有帮助。