2017-09-19 5 views
-1

最近、私はUNIXシステムプログラミングの学習に興味があります.3次元ポインタメモリについて無料で問題が発生し、メモリリークを回避するためにメモリを解放する方法を教えてください。 main()関数でメモリを解放したいのですが、どうやって修正するのか分かりません.cの3次元ポインタに慣れていないので、makeargv()で "char * t"を解放する方法もあります。本当にありがとう。Cの3次元ポインタメモリ

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

ようこそ。あなたは「私はそれを修正する方法がわからないので、私はcに慣れていないからです」と書いています。その場合、おそらくいくつかのチュートリアルから始めて、あなたが求めている問題についての基本的な知識を得るべきです。 SOはチュートリアルでもコード作成サービスでもありません。 –

+0

私はコラージュの学校でCプログラミングを学んでいますが、長い時間がたってから、私はいくつかの機能を忘れてしまいました。 –

+0

これはむしろ恐ろしいプログラミングの習慣です。あなたが勉強すべきものではありません。 3レベルの間接指定を使用する理由は、パラメーター・リストを介してポインター・ポインターを戻したいからです。しかし、これは悪評であり、広く知られている "3つ星のプログラミング"と広く知られています。通常、構造体の配列を使用するなど、同じ結果を得るためのより良い方法があります。 – Lundin

答えて

1

こんにちは、ここで私は私達ができるので、私はT3Dををmallocするために使用する方法を追加しますどのように完全に無料で、全体のトライ次元ポインタ

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

ですから、基本的には、文字列(タブ**に含まれています)に割り当てられたスペースを解放するだけです。次に、2次元ポインタ(タブ*)に割り当てられた領域を削除してから、3次元ポインタ(タブ)に割り当てられた領域を解放します。

タブをフリーにしてタブをフリーにしないと、タブ[I]またはタブ[I] [J]にアクセスできなくなりますが、そのメモリは割り当てられます。
あなたのプログラムに役立つことを願っています。

+0

シンプルで効率的ですが、 'while(something!= NULL)'が冗長で、 'while(something)'だけを追加したいのですが cuz Cはすばらしい – Adalcar

+1

'tab [i] = malloc( sizeof(char *)* 10); '、' tab [i] = malloc(sizeof *(tab [i])* 10); 'を考えてください。簡単に正しくコーディングし、レビューし、維持します。 – chux

+1

@chuxああ、私は忘れてしまいます。変数の型を直接的に変えることは可能ですが、次回はそれを覚えようとします。ありがとうございます。 – Cjdcoy