• ベストアンサー

free()への引数について

επιστημη(@episteme)の回答

回答No.2

free(&p) あらため free(p) でしょうね。

sting
質問者

お礼

下位への引数をダブルポインタにしなければなぜ上位で参照できないのでしょうか? 仕様でしょうか?それとも根本的に無理だからでしょうか? free(p)が正しいのですか。もし下位でfreeするのであれば、free(*p)となるのでしょうか?

関連するQ&A

  • C free関数の開放について。

    独学でCを勉強し始めてる初心者です。 以下の構文で、最後に、 free(p); とあり、確保したメモリ「p」を開放していますが、 確保したメモリ「q」は開放しなくて良いのでしょうか? この場合は同じ部分のメモリを確保しているからqは開放しなくて良いということなんでしょうか…宜しくお願い致します。 #include <stdio.h> #include <stdlib.h> int main(void) { int *p; p=malloc(sizeof(int)*3); if(p==NULL) exit(1); p[0]=10; p[1]=20; p[2]=30; printf("%d\n",p[0]+p[1]+p[2]); free(p); return=0; }

  • 多元配列について(ANSI C)

    動的多元配列で、 Voidポインタに、多種の型がぶら下がった多元配列を作り、 読み書きをしたいのですがどのようにしたらよろしいでしょうか。 具体的には、 x[0][1]は、intで「2」が入っている x[0][4]は、intで「9」が入っている x[1][2]は、charでしかも文字列の配列で「goo」が入っている x[1][5]は、charでしかも文字列の配列で「教えて」が入っている x[0]は、int型の配列。X[1]は、文字列型の配列。 というようなものです。 一応ソースは作ってみたのですが、int型では問題なくいくのですが、 文字列は、コンパイルはできますが、実行すると予期せぬことが起きます。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main (void) {      void **topPointa;      int * iDataInput;      int * iDataOutput ;      char * chDataInput;      char * chDataInput2;      char * chDataOutput1 ;      // ポインタアドレス用のメモリ確保      topPointa = (void *) calloc (10 , sizeof(void *));      if(topPointa == NULL) {           printf("メモリが確保できません\n");           exit(-1);      }      //int配列のメモリ確保      iDataInput = (int * ) calloc (10 , sizeof(int));      if(iDataInput == NULL) {           printf("メモリが確保できません\n");           exit(-1);      }      iDataInput[0] = 3 ;      iDataInput[1] = 4 ;      topPointa[0] = (void * ) &iDataInput;      //int配列の取り出し      iDataOutput = *(int *) topPointa[0];      printf( "int: %d\n", iDataOutput[0] );      printf( "int: %d\n", iDataOutput[1] );      //char配列 のメモリ確保      chDataInput = (char * ) calloc (10 , sizeof(char *));      if(chDataInput == NULL) {           printf("メモリが確保できません\n");           exit(-1);      }      chDataInput2 = (char * ) calloc (10 , sizeof(char));      if(chDataInput2 == NULL) {           printf("メモリが確保できません\n");           exit(-1);       }      strcpy(chDataInput2 , "hoe");      chDataInput[0] = &chDataInput2;      topPointa[1] = (void * ) &chDataInput;      //char配列の取り出し      chDataOutput1 = *(char *) topPointa[1];      printf( "char: %S\n", chDataOutput1[0] );      free(iDataInput);      free(chDataInput);      free(chDataInput2);      return 0; } 言語は、C言語ANCI Cでお願いします。 以上。よろしくお願いします。

  • 配列を引数にする方法

    以下の配列の引数の入れ方と受け方を教えて下さい int** p; /* malloc でp[4][2]を確保 */ test(p); <<=ここ --------------------------- void test(int p[][2]){ <<=ここ printf("%3d",p[0][0]); <<=ここ

  • char型ポインタ

    よくプログラムで charポインタだけ指定して、 #include<stdio.h> int main(){ char* p; p = "abcdef"; printf("%s",p); return 0; } のようにしているのをみかけますが、 メモリーを確保していなくても問題ないのでしょうか? char* p; p = (char*)malloc(7); strcpy(p,"abcdef"); としたのと同じでしょうか?

  • 再帰プログラム

    strに格納されている文字数を数えるプログラムです。 #include<stdio.h> int rstrlen(char *); int main(void) { char str[] = {"abcdefghijk"}; printf("文字数:%d\n",rstrlen(str)); return 0; } int rstrlen(char *p) { if(*p) { p++; printf(p); return 1 + rstrlen (p); } else return 0; } return 1 + rstrlen (p);の部分で再帰をし1をプラスすることにより文字数をカウントしmainのprintfで文字数を表示しているのですがカウントしている値はどこに格納していてどのようにmainに返しているのかが分かりませんでした。教えてください。

  • 再帰プログラム

    #include<stdio.h> int rstrlen(char*); int main(void) { char str[100]; printf("文字列を入力してください\n"); gets(str); printf("文字数は %d です\n",rstrlen(str)); return 0; } int rstrlen(char *p) { if(*p){ p++; return 1+rstrlen(p); } else return 0; } 文字数を計算するプログラムです。 if(*p)の*pとはNULLを表しているのですか?

  • VC++ 再帰関数

    ■キーボードより読み込んだ文字列の長さを求めるプログラムを再帰関数を使って作る #include <stdlib.h> int unk_r(char*p)   {    if(*p == 0x00)    return(0);   else    return(1+unk_r(p+1));   } int main()   {    char *i;    i = (char *)malloc(20);    scanf("%s",i);    printf("%d\n",unk_r(i));   } このプログラムについて、行、単語ひとつひとつ細かいところまで具体的に解説お願いします。どういう働きをしているのか等。 例えば #include <stdlib.h> はmallocを使うのに必要などなど。 よろしくお願いします。

  • malloc メモリリークについて

    #include<stdio.h> #include<stdlib.h> void alloconly(void) { const int sz=10; static int n=0; void *p; p=(void*)malloc(sz); if(p==NULL){ printf("動的確保不可 %d\n",n+1); printf("確保メモリサイズ %d byte\n",sz*n); exit(-1); } ++n; } int main(void) { for(;;){ alloconly(); } }と言うプログラムがある本に載っており、回答として   動的確保不可 *******(数字)   確保メモリサイズ *********byte(数字)となっていますが私の環境(Reshat Linux)では   強制終了します で終了してしまいます。原因が判らず困っています。ご解答願います。

  • コマンドライン引数について。

    コマンドライン引数についての質問です。 コマンドライン引数に適当な数字をいれ、金種別にわけるプログラムですが、 コマンドライン引数に負の値や、文字列を入力したときにはエラーが表示させるようにしているのですが、 数字と文字を混合したもののときはエラーが表示されずにそのまま処理されてしまいます。 初めの一文字目が数字だったらそのあとに文字を入れても実行されてしまうようです。 全て数字の場合のみ実行させてそれ以外はエラーメッセージを表示させたいのですが、どのようにすればいいでしょうか? #include <stdio.h> #include <stdlib.h> int syubetu(int money,int *kinsyu); int *kinsyu; int main(int argc,char *argv[]) { int *p,a; p=(int*)malloc(sizeof(int)*9); if(p==NULL){ printf("メモリ確保失敗\n"); exit(1); } a=atoi(argv[1]); if(a>0){ syubetu(a,&p[0]); printf("1万円 %d枚\n",p[0]); printf("5千円 %d枚\n",p[1]); printf(" 千円 %d枚\n",p[2]); printf("5百円 %d枚\n",p[3]); printf(" 百円 %d枚\n",p[4]); printf("50円 %d枚\n",p[5]); printf("10円 %d枚\n",p[6]); printf(" 5円 %d枚\n",p[7]); printf(" 1円 %d枚\n",p[8]); } else{ printf("入力エラー\n"); exit(1); } } int syubetu(int money,int *kinsyu) 800字以上になるため、処理は省略します。

  • malloc関数について質問です。

    整数を入力してその分だけ動的にメモリを確保し、その後文字列を入力して確保した領域に格納し、表示するプログラムなんですが、 int main(void) { int n; char *p; puts("整数を入力"); scanf("%d", &n); p = malloc(sizeof(char) *(n+1)); puts("文字を入力");   scanf("%s", p); printf("文字列は%s\n", p); free(p); return 0; } としたら、ちゃんとプログラムは動くんですが、 問題の意図にあっているんでしょうか?