• ベストアンサー

C言語のメモリ領域確保

ポインタ変数ををmain関数で宣言し、関数test()にて必要分だけ領域確保してそのアドレスをmain関数のポインタ変数に渡して利用することは可能でしょうか。 (サイズのわからないテキストデータを、十分に大きな配列に入れるのではなく、関数でメモリを動的確保して無駄の無い配列に入れたい等) C言語ではやはり無理で、構造体のリストにするのが一番でしょうか。 初歩的なことで申し訳ありませんがどなたかお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#119918
noname#119918
回答No.2

関数getmem中で指定バイト数のメモリを動的に確保し、 main関数にポインタを返します。 main関数中で、確保したメモリに文字列を格納します。 最後にmain関数中でfreeします。 (蛇足ですが、個人的にはこの方法はあまり良くないと思います。 というのも、メモリを確保する場所と、解放する場所が別の関数に 別れてしまうので、freeを忘れがちになると思います。 実際、下記のコードを最初書いた際には忘れてしまい、 見返した時に思い出しました。) #include <stdio.h> #include <stdlib.h> #include <string.h> void * getmem(size_t size); int main(void) { char * buf = getmem(10); strncpy(buf, "message", 10); printf("%s\n", buf); free(buf); return 0; } void * getmem(size_t size) { void * ptr = malloc(size); if(ptr == NULL) { fprintf(stderr, "cannot allocate memory.\n"); exit(EXIT_FAILURE); } printf("allocated memory %d bytes.\n", size); return ptr; }

old_one
質問者

お礼

詳しくお答えいただいてありがとうございます。 私もfreeをするのを忘れていました。 void型で確保するというのも考えませんでした。 注意点等参考にしながらやっていきたいと思います。 ありがとうございました。

その他の回答 (2)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

こんな感じでしょうか? char *test(FILE *stream) {  size_t length = 0;  size_t size = 256; /* 適当に決める */  char *ptr = NULL;  do  {   char *ptr2 = realloc(ptr, length + size + 1);   if (ptr2 == NULL)   {    free(ptr);    return NULL;   }   ptr = ptr2;   length += fread(ptr + length, 1, size, stream);  } while (!feof(stream));  ptr[length] = '\0';  return ptr; } あらかじめ長さが分からないテキストストリームから文字列を読み出しています。バッファの大きさはその都度拡張しています。

old_one
質問者

お礼

解答ありがとうございます。 関数側で確保してそのポインタを返すといった感じになるんですね。 参考にしていろいろ試したいと思います。 ありがとうございました。

noname#198419
noname#198419
回答No.1

うろ覚えなのでアレなのですが、質問の内容としては・・・・ #define MAXITEM 63 int test(void* MEMORY_POINTER, size_t SIZE) { MEMORY_POINTER = malloc(SIZE); if( NULL != MEMORY_POINTER ) return 0; else return 1; } int main(char **argv, int argc) { struct *list{ char *data; int length; struct list *next; } int memerr; ・ ・色々な処理を割愛 ・ memerr=test(list , MAXITEM); /*空リスト*/ ・ ・色々な処理を割愛 ・ list.length=256; memerr=test(list.data , list.length); /*メンバの領域*/ ・ ・色々な処理を割愛 ・ free(list.data); /*要らなくなったら開放*/ free(list); /*要らなくなったら開放*/ ・ ・色々な処理を割愛 ・ return EXIT_SUCCESS; /*おしまい*/ } みたいな事がしたい。ということなのかな?

old_one
質問者

お礼

解答していただきありがとうございます。 やりたいこととしては、お答えいただいたような 関数側で領域確保してmain側で利用するという感じです。 関数側でmalloc等で領域確保して、ポインタを介してをmain側で 利用する場合、その領域はmain側で正常に利用できるのか 不安がありましたので質問させていただきました。 とりあえず解答していただいたことを参考に試してみたいと思います。 ありがとうございました。

関連するQ&A