Как получить доступ к первому элементу структуры в C после выполнения цикла

#c #structure

Вопрос:

В C я использую цикл for для ввода элементов структуры и успешно ввожу их. Тем не менее, после того, как я зациклился на вводе, я хочу получить доступ ко всем элементам, которые я создал с помощью функции malloc с самого начала, чтобы распечатать элементы. Как я могу выполнить цикл из первого элемента выделенной памяти после использования цикла для создания элементов структуры?

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

struct Ogrenci{
    
    char isim[50];
    char soyisim[50];
    int numara;
    float vizeNotu;
    
};

void main(){
    
    struct Ogrenci *geciciOgrenci;
    float ortalamaNot = 30;
    int i;
    char isim[50];
    char soyisim[50];
    int numara;
    float vizeNot;
    
    for(i=0; i<5; i  ){
        geciciOgrenci = malloc(sizeof(struct Ogrenci));
        printf("Ismi girin: ");
        scanf("%s",isim);
        printf("Soyisim girin: ");
        scanf("%s",soyisim);
        strcpy(geciciOgrenci->isim,isim);   
    }
    
}
 

Ответ №1:

Ваш код выделяет память и сохраняет в ней свой адрес geciciOgrenci . Это работает для первого элемента, однако начиная со второго элемента новый выделенный адрес перезаписывает предыдущий. Внесите следующие изменения.

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

struct Ogrenci{
    
    char isim[50];
    char soyisim[50];
    int numara;
    float vizeNotu;
    
};

void main(){
    
    struct Ogrenci *geciciOgrenci[5]; //declare array of pointers
    float ortalamaNot = 30;
    int i;
    char isim[50];
    char soyisim[50];
    int numara;
    float vizeNot;
    
    for(i=0; i<5; i  ){
        geciciOgrenci[i] = malloc(sizeof(struct Ogrenci)); // store the address in the ith element
        printf("Ismi girin: ");
        scanf("%s",isim);
        printf("Soyisim girin: ");
        scanf("%s",soyisim);
        strcpy(geciciOgrenci[i]->isim,isim); // refer to the ith element   
    }    
    for(i=0; i<5; i  ){
        printf("%s n", geciciOgrenci[i]->isim); // access the elements
    }
    
}