Как мне заполнить массив указателями на структуры - PullRequest
0 голосов
/ 24 мая 2018

Я должен заполнить массив указателями на структуры.Структура выглядит так:

typedef struct {
  char* name;
  double weiten[3];
} springer;

Теперь я хочу заполнить массив springer * spr [].У меня есть массив строк с именем namen, а n - это количество элементов, которое я хочу иметь в конце массива.

Функция для заполнения массива:

void fuellen(springer *spr[], const char* namen[], int n){
spr=calloc(n,sizeof(springer));
for(int i=0;i<n;i++){
    (*spr[i]).name=calloc(30,sizeof(char));
     strcpy((*spr[i]).name, namen[i]);
    spr[i]->weiten[0]=zufallsWeite();
    spr[i]->weiten[1]=zufallsWeite();
    spr[i]->weiten[2]=zufallsWeite();
}
}

Итакструктуры, на которые указывает массив, должны быть заполнены структурами с именами в моем массиве символов в качестве имен.Массив, который также является частью структур, должен быть заполнен 3 случайно сгенерированными числами от 6 до 9 (zufallsWeite () дает их.

Теперь в основной функции я хочу использовать функцию:

const int N = 5;
const char *names[] = {"Tom Mueller","Timo Meier","Ulf Sommer","Tobi 
Winter","Uwe Schmidt"};

springer *spr[N];
fuellen(spr, names, N);

Сборка работает, но затем программа закрывается, и я получаю сообщение об ошибке. Может кто-нибудь сказать мне, что я делаю неправильно? Я искал некоторое время, но ничего не нашел.

1 Ответ

0 голосов
/ 24 мая 2018

У вас есть (комментарии, добавленные мной):

void fuellen(springer *spr[], const char* namen[], int n){
    // At this point, spr is a pointer to the first element in
    // the array that was passed into the funtion.
    spr=calloc(n,sizeof(springer));
    // Now spr, a local pointer value, points to zeroed memory in the heap.
    // The following loop copies strings from namen[] to spr[].
    for(int i=0;i<n;i++){
        //(*spr[i]).name=calloc(30,sizeof(char));
        //strcpy((*spr[i]).name, namen[i]);
        strdup(namen[i];)
        spr[i]->weiten[0]=zufallsWeite();
        spr[i]->weiten[1]=zufallsWeite();
        spr[i]->weiten[2]=zufallsWeite();
    }
    // Unfortunately, all that work, including the heap
    // allocation is lost when this function returns.
}

Только не перезаписывайте spr при вызове calloc.

void fuellen(springer *spr[], const char* namen[], int n){
    // spr[] was allocated by the caller!
    // Allocate each element of the array and initialize the struct.
    for(int i=0;i<n;i++){
        spr[i] = malloc(sizeof(springer));
        spr[i]->name = strdup(namen[i]);
        spr[i]->weiten[0]=zufallsWeite();
        spr[i]->weiten[1]=zufallsWeite();
        spr[i]->weiten[2]=zufallsWeite();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...