2016-11-29 7 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'.] (HTTP : //stackoverflow.com/q/605845/2173917). –

+0

'void allocate (int *** ascending' ... и' void print (int ** ascending' ... isn; t что-то? –

+0

___ Пожалуйста, не изменяйте вопрос/код после получения ответа. Это делает ответ неправильным .___ –

ответ

0

Прежде всего массивы переменного размера не могут быть инициализированы. Вы должны использовать MACRO для array_length.

Затем, согласно определению вашей функции, вызов print() нуждается в int ** в качестве первых двух аргументов, а не int ***. Измените вызов функции

print(ascending, descending, array, array_length); 

также, ascending[i] и descending[i], в этом случае имеют тип int *, вам нужен еще один уровень разыменования, чтобы получить int.

Это говорит,

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], & (array [i]) –

+0

@J. Дониван Не быть грубым, но серьезно, если вы не понимаете, пришло время вернуться и прочитать главу для указателей в книге C. Это действительно сложная часть, которую вы должны хорошо понять, прежде чем прыгать в код. :) –

+0

Это означает, что '* (ascending [i])' разыменовывает 'asccending [i]' (указатель), тогда как '* по возрастанию) [i]' сначала разыгрывает указатель 'asccending ', а затем, разыгрывать (индексировать) это еще раз. –

 Смежные вопросы

  • Нет связанных вопросов^_^