2016-04-09 18 views
0

私はいくつかの助けが必要です。データを入力してポインタに保存しようとすると、プログラムがクラッシュします。私は正常に動的配列の最初の要素にデータを入力することができます、私もそのデータを印刷することができます。しかし、その後、2番目の要素を入力しようとすると、プログラムがクラッシュします。デバッガにエラーや警告は表示されません。関数内のポインタに関する問題

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

static const char SPRTR[] = "//---------------------------------------------------------------------------//"; 
static const char ERR_MSG[] = "ERROR! Try again."; 

void create_array(int **data, int *n, int *arr_max) 
{ 
    int i; 
    int err; 
    char temp; 

    do 
    { 
     err = 0; 
     printf("\nMaximum number of array elements: "); 
     if (((scanf("%d", arr_max)) < 1) || (*arr_max <= 0)) 
     { 
      printf("%s\n", ERR_MSG); 
      err = 1; 
     } 
     printf("\n%s\n", SPRTR); 
     while ((temp = getchar()) != '\n' && temp != EOF); 
    } while (err != 0); 

    do 
    { 
     err = 0; 
     printf("\nNumber of array elements (max. %d): ", *arr_max); 
     if (((scanf("%d", n)) < 1) || (*n > *arr_max) || (*n <= 0)) 
     { 
      printf("%s\n", ERR_MSG); 
      err = 1; 
     } 
     printf("\n%s\n", SPRTR); 
     while ((temp = getchar()) != '\n' && temp != EOF); 
    } while (err != 0); 

    *data = (int *) malloc(sizeof(int) * (*n)); 

    for (i = 0; i < *n; i++) 
    { 
     do 
     { 
      err = 0; 
      printf("\nValue of %d array element: ", i); 
      if (((scanf("%d", *(data + i))) < 1) || (*(*(data + i)) < 0)) 
      { 
       printf("%s\n", ERR_MSG); 
       printf("\n%s\n", SPRTR); 
       err = 1; 
      } 
      while ((temp = getchar()) != '\n' && temp != EOF); 
     } while (err != 0); 
    } 
} 

int main() 
{ 
    int n; 
    int arr_max; 
    int *data; 

    create_array(&data, &n, &arr_max); 

    return 0;  
} 
+0

デバッガ........................ .... –

答えて

1

あなたのコンパイラ(とも鉱山)は、あなたが正しい種類を使用し、まだ2つのエラー(実際には2回同じエラーが)この文であるため、エラーを見つけることができません:

if (((scanf("%d", *(data + i))) < 1) || (*(*(data + i)) < 0)) 

datamallocの結果を保持するint *へのポインタ(アドレス)です。 あなたがアクセスできるint(*data)[i]であり、そのアドレスは*data + iです。したがって、この行は次のように置き換えてください:

if (((scanf("%d", *data + i)) < 1) || ((*data)[i] < 0)) 

少なくともそれは私のために働いています。

+0

ありがとうございます。これは本当に役に立ちました。なぜなら私はC言語(そしてプログラミング全体)に新しいので、時にはポインタやアドレスがわかりにくいことがあります。 –

0

問題あなたはへのポインタでない場所を逆参照の代わりに、現在の要素 へのポインタを取得するために、データを逆参照して、オフセットを追加する必要がありますライン

if (((scanf("%d", *(data + i))) < 1) || (*(*(data + i)) < 0)) 

であると思われます配列そのもの。

交換してみてください*データと *(データ+ I)+私はその文になる場合:

if (((scanf("%d", *data + i)) < 1) || ((*(*data + i)) < 0)) 

*(*データ+ i))を単に取得された配列のオフセットので、これを(* data)[i]に置き換えることができるので、if文は次のようになります。

if (((scanf("%d", *data + i)) < 1) || ((*data)[i] < 0)) 
関連する問題