2016-05-11 5 views
1

私はこの素晴らしいサイトを使い慣れていて、多くの場面で非常に便利だと分かっていましたが、今は解決できないような問題に取り組んでいます。 私は初心者Cの学生です。私は動的なメモリ割り当てを研究しています。 main関数ではなく、プロシージャ内で整数を割り当て、その中にメモリを割り当てる動的配列を作成したいと考えています。Cのプロシージャで動的配列を作成するにはどうすればよいですか?

これは動作します:

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
     int *numbers; // pointer to create a dynamic array 
     int *test; // pointer to test realloc function 
     int c; 
     size_t i = 0; 
     unsigned int dim; // array's length 

     // allocate memory for the 1st number 
     numbers = malloc(sizeof(*numbers)); 
     if (numbers == NULL) { 
       fputs("Error while allocating memory!\n", stderr); 
     } else { 
       printf("Insert the 1 number: "); 
       scanf("%d", &numbers[0]); 
       ++i; 

       /* allocate memory for the other numbers, 
       * until the user inputs EOF 
       */ 
       while (!feof(stdin)) { 
         test = realloc(numbers, (sizeof(*numbers) * (i + 1))); 
         if (test == NULL) { 
           fputs("Error while allocating memory!\n", stderr); 
         } else { 
           numbers = test; 
           printf("Insert the %u number: ", i + 1); 
           scanf("%d", &numbers[i]); 
           ++i; 
         } 
       } 
       dim = --i; 

       // print the array, 5 numbers per line 
       for (i = 0; i < dim; ++i) { 
         if (i % 5 == 0) { 
           puts(""); 
         } 
         printf("%d ", numbers[i]); 
       } 
       puts(""); 
     } 

     getchar(); 
     return 0; 
} 

をしかし、私は(動作しない)これをしたい:

#include <stdio.h> 
#include <stdlib.h> 

void get_numbers(int **numbers, unsigned int *dim); 

int main() 
{ 
     int *numbers; // pointer to create a dynamic array 
     size_t i = 0; 
     unsigned int dim; // array's length 

     get_numbers(&numbers, &dim); 

     // print the array, 5 numbers per line 
     for (i = 0; i < dim; ++i) { 
       if (i % 5 == 0) { 
         puts(""); 
       } 
       printf("%d ", numbers[i]); 
     } 
     puts(""); 

     getchar(); 
     return 0; 
} 

void get_numbers(int **numbers, unsigned int *dim) 
{ 
     int *test; // pointer to test realloc function 
     int c; 
     size_t i = 0; 

     // allocate memory for the 1st number 
     *numbers = malloc(sizeof(*numbers)); 
     if (*numbers == NULL) { 
       fputs("Error while allocating memory!\n", stderr); 
     } else { 
       printf("Insert the 1 number: "); 
       scanf("%d", &numbers[0]); // Maybe the error is here 
       ++i; 

       /* allocate memory for the other numbers, 
       * until the user inputs EOF 
       */ 
       while (!feof(stdin)) { 
         test = realloc(*numbers, (sizeof(*numbers) * (i + 1))); 
         if (test == NULL) { 
           fputs("Error while allocating memory!\n", stderr); 
         } else { 
           *numbers = test; 
           printf("Insert the %u number: ", i + 1); 
           scanf("%d", &numbers[i]); 
           ++i; 
         } 
       } 
       *dim = --i; 
     } 
}  

は私が右、intへのポインタへのポインタを使用する必要がありますか? 私はいくつかの間違いをしましたが、私はそれらを修正する方法を理解できません。 あなたの返信をお寄せいただきありがとうございます! さようなら、コードの最初のブロックにおいて ファビオNardelli

+2

'のscanf( "%d個"、&番号[I]);' - > 'のscanf( "%d個"、&(*番号) [size](* numbers) ' - > sizeof(** numbers)' – BLUEPIXY

+0

@BLUEPIXY多くのありがとうございます!できます!!!! –

+0

@BLUEPIXY構造体の配列がある場合はどうなりますか?たとえば、struct data * p; scanfは(* p)[i] .fieldですか? –

答えて

1

numbersタイプint*です。
コードの2番目のブロックでは、numbersint**です。

その変更のために修正が必要な場所をすべて修正していません。

私の提案:

  1. 変更numbersPtrへの入力引数。
  2. ローカル変数int* numbersを作成します。
  3. 関数から戻る前に、*numbersPtrnumberに設定してください。

void get_numbers(int **numbersPtr, unsigned int *dim) 
{ 
    int* numbers; 

    ... 

    *numbersPtr = numbers; 
} 

numbersを返すようにget_numbersを変更した方がよいでしょう。

int* get_numbers(unsigned int *dim) 
{ 
    int* numbers; 

    ... 

    return numbers; 
} 

としてその使用方法を変更:

numbers = get_numbers(&dim); 
+0

返信いただきありがとうございます!だからあなたはscanfで数字を使うつもりですか? –

+0

@FabioNardelli、コードの最初のブロックで使ったのと同じように 'numbers'を使います。 –

+0

@R Sahuありがとう、それは動作します! –

関連する問題