2016-11-29 15 views
0

関数内のポインタの配列にメモリを割り当てる方法を調べるのに問題があります。この同じ関数では、別の配列の値で配列を初期化しようとしています。私はいろいろなことをしばらく試してきたので、私がどこにいるのか分からないのか分かりません。ポインターの配列の関数にメモリを割り当てて値を割り当てる方法は?

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

void allocate(); 
void print(); 

int main() { 

    int array_length = 10; 

    int array[array_length] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 

    int **ascending; 
    int **descending; 

    allocate(&ascending, &descending, array, array_length); 

    print(&ascending, &descending, array, array_length); 

} 

void allocate(int ***ascending, int ***descending, int array[], int array_length) { 

    *ascending = (int **)malloc(array_length * sizeof(int *)); 
    *descending = (int **)malloc(array_length * sizeof(int *)); 

    int i, first_index = 0; 

    for (i = 0; i < array_length; i++) { 

     (*ascending)[i] = &(array[i]); 
     (*descending)[i] = &(array[i]); 

    } 

} 

void print(int **ascending, int **descending, int array[], int array_length) { 

    int i; 

    printf("\nAscending\tOriginal\tDescending\n\n"); 

    for (i = 0; i < array_length; i++) { 

     printf("%d\t\t", ascending[i]); 
     printf("%d\t\t", array[i]); 
     printf("%d\t\t", descending[i]); 

     printf("\n"); 

    } 

    printf("\n"); 

} 
+0

のように見えるかもしれ[C ' 'に'のmalloc() 'と家族の戻り値をキャストさせない理由でこの議論を参照してください。](HTTP ://stackoverflow.com/q/605845/2173917)。 –

+0

'無効割り当てる(int型*** ascending' ...と'無効印刷(int型** ascending' ... ISN;?あなたが応答を持ってたらその何かトン –

+0

___Please質問/コードを変更しないでください。これは、答えはあなたに感謝。これは、働いていた間違った.___ –

答えて

0

まず、可変サイズの配列は初期化できません。 array_lengthのMACROを使用する必要があります。

あなたの関数定義によれば、print()への呼び出しはint ***ではなく最初の2つの引数としてint **を必要とします。この場合には、

print(ascending, descending, array, array_length); 

ascending[i]descending[i]への関数呼び出しを変更し、タイプint *のものであり、あなたはintを取得するために間接参照の1つの以上のレベルが必要です。言っ

は、

void allocate(); 
void print(); 

悪い前方宣言しています。宣言と定義の関数の正確な署名を使用する必要があります。


サンプル作業バージョンが何か

//gcc 4.9.3 

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

#define arraysize 10 

void allocate(int ***ascending, int ***descending, int array[], int array_length); 
void print(int **ascending, int **descending, int array[], int array_length); 

int main(void) { 

    int array_length = arraysize; 

    int array[arraysize] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 

    int **ascending; 
    int **descending; 

    allocate(&ascending, &descending, array, array_length); 

    print(ascending, descending, array, array_length); 

    return 0; 

} 

void allocate(int ***ascending, int ***descending, int array[], int array_length) { 

    *ascending = (int **)malloc(array_length * sizeof(int *)); 
    *descending = (int **)malloc(array_length * sizeof(int *)); 

    int i = 0;//, first_index = 0; 

    for (i = 0; i < array_length; i++) { 

     (*ascending)[i] = &(array[i]); 
     (*descending)[i] = &(array[i]); 

    } 

} 

void print(int **ascending, int **descending, int array[], int array_length) { 

    int i; 

    printf("\nAscending\tOriginal\tDescending\n\n"); 

    for (i = 0; i < array_length; i++) { 

     printf("%d\t\t", *(ascending[i])); 
     printf("%d\t\t", array[i]); 
     printf("%d\t\t", *(descending[i])); 

     printf("\n"); 

    } 

    printf("\n"); 

} 
+0

を見せるあなたは以下の違いを説明することができます!:*(*昇順)、([i]の昇順)[i]は、&(配列[i])と –

+0

@J。 Donivanは失礼ではないとしていますが、違いを取得しない場合は真剣に、それは戻って、C帳にポインタのための章を読む時間です。これは本当にあなたがコードに飛び込む前によく把握しなければならないトリッキーな部分です。 '*上昇、一方:) *'、前記 –

+0

(昇順[i]が) ')、'昇順[I] '(ポインタ)を参照解除される[i]は' ascending'ポインタ間接参照最初、その後、もう一度逆参照(インデックス)してください。 –

関連する問題