最近、私は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;
}
ようこそ。あなたは「私はそれを修正する方法がわからないので、私はcに慣れていないからです」と書いています。その場合、おそらくいくつかのチュートリアルから始めて、あなたが求めている問題についての基本的な知識を得るべきです。 SOはチュートリアルでもコード作成サービスでもありません。 –
私はコラージュの学校でCプログラミングを学んでいますが、長い時間がたってから、私はいくつかの機能を忘れてしまいました。 –
これはむしろ恐ろしいプログラミングの習慣です。あなたが勉強すべきものではありません。 3レベルの間接指定を使用する理由は、パラメーター・リストを介してポインター・ポインターを戻したいからです。しかし、これは悪評であり、広く知られている "3つ星のプログラミング"と広く知られています。通常、構造体の配列を使用するなど、同じ結果を得るためのより良い方法があります。 – Lundin