2016-12-29 9 views
-1

タイトルで述べたように、次のコードの主な機能のように、*を2回使用することに関して質問があります。それは実行されますが、なぜ**を使用しているのか分かりません。私が望むのは、parrがベースアドレスであるnというサイズのSPPointsの配列です。この場合、**正しいと*間違っているのはなぜですか?ありがとう。C、ポインタ(またはポインタへのポインタ?)、**、malloc

SPPointコード:

struct sp_point_t 
{ 
    double* data; 
    int dim; 
    int index; 
}; 

SPPoint* spPointCreate(double* data, int dim, int index) 
{ 
    if (data == NULL || dim <= 0 || index < 0) 
    { 
     return NULL; 
    } 
    SPPoint* point = malloc(sizeof(*point)); 
    if (point == NULL) 
    { 
     return NULL; 
    } 
    point->data = (double*)malloc(dim * sizeof(*data)); 
    for (int i = 0; i < dim; i++) 
    { 
     point->data[i] = data[i]; 
    } 
    point->dim = dim; 
    point->index = index; 
    return point; 
} 

、これが主な機能である:

int main() 
{ 
    int n, d, k; 
    scanf("%d %d %d", &n, &d, &k); 
    double* darr = malloc(d * sizeof(double)); 
    if (darr == NULL) 
    { 
     return 0; 
    } 
    SPPoint** parr = malloc(n * sizeof(SPPoint*)); 
    if (parr == NULL) 
    { 
     return 0; 
    } 
    for (int i = 0; i < n; i++) 
    { 
     for (int j = 0; j < d; j++) 
     { 
      scanf(" %lf", &darr[j]); 
     } 
     parr[i] = spPointCreate(darr, d, i); 
    } 
} 
+0

'SPPoint ** parr;'はポインタ(配列)のポインタです – wildplasser

+0

'SPPoint * spPointCreate(...)' BTW:SPPointは* typedeffedではありません。 C++コンパイラを使用していますか? – wildplasser

+0

これはヘッダファイルにありますが、それを含めないと申し訳ありません。 – Gray

答えて

-1

配列はポインタと同様に振る舞うことができます。たとえば、int a []はint * aと非常によく似ています。 SPPointの各関数は、SPPoint構造体へのポインタを返します。 SPPointへのポインタの配列は、SPPointへのポインタへのポインタとして記述できます。 mallocコマンドを使用すると、SPPoint構造体へのポインタを格納するための一定量のメモリ(SPPointへのn個のポインタを保持するには十分)を指定しています。

しかし、すべてのポインタが配列であるわけではありません。 SPPoint ** parrは、SPPoint型の単一構造体へのポインタを保持する配列として動作します。

特に文字列に使用する場合、配列はポインタとは異なる動作をする可能性があります。

SPPointへのポインタを使用することが有利なのは(今のように)、構造体全体をコピーすることなく単一の要素を表示または変更できるからです。

+0

非常に良い答えは、ありがとう。 – Gray

+0

あなたは大歓迎です! – Rusty

+3

配列はポインタとして考えることはできません。int以上はdoubleと考えることができます –

0

動的に割り当てられた配列を使用する場合、通常、配列の最初の要素へのポインタを持ち、長さを明示的に格納するなど、長さを知る方法がありますセンチネル。

あなたのコードを持っているようSPPoint *の動的に割り当てられた配列のためので、それらの最初のものへのポインタがあなたの既存のコードは、すなわちポインタの配列SPPoint *の配列を作成しますSPPoint * *

入力しています。これらのポインタのそれぞれは、動的に割り当てられたSPPointのインスタンスを指しています。つまり、エントリごとに別々の割り当てがあります。

これは実行可能ですが、代わりにSPPointの配列が必要であることを示しています。その場合、最初の要素へのポインタはSPPoint *です。

このような配列を持つためには、単一のメモリ割り当てです。したがって、spPointCreate機能を再設計する必要があります。現時点では、メモリを割り当て、ただ1つのSPPointを初期化します。代わりに、割り当てを1つだけ必要とするが、複数の初期化が必要なため、割り当てを初期化から切り離したいとします。

あなたはこれを試してみましたが、その後捕まってしまった場合はnSPPoint

  • が割り当てられたスペース内の各SPPointを初期化するために十分な大きさのメモリの1つのブロックを割り当てる

    • :あなたのプログラムロジックは次のように読みますあなたのコードを示す新しい質問を投稿し、どこにいらっしゃいましたか説明してください。

  • 関連する問題