Malloc и Realloc не работают (C11 - CLion) - PullRequest
0 голосов
/ 07 мая 2018
#include <stdio.h>
#include <stdlib.h>

typedef struct Ogrenciler {
    int no;
    char adi[50];
    char soyadi[50];
    double vize;
    double final;
    double notu;
} Ogr;

int ogrenciSayisi = 0;

void KayitEkle(Ogr *ogrenci) {
    int simdikiOgr = ogrenciSayisi;
    if (ogrenciSayisi == 0) {
        ogrenciSayisi++;
        ogrenci = (Ogr *) malloc(ogrenciSayisi*sizeof(Ogr));
    } else {
        ogrenciSayisi++;
        ogrenci = (Ogr *) realloc(ogrenci, ogrenciSayisi * sizeof(Ogr));
    }
    printf("No:");
    scanf("%d", &ogrenci[simdikiOgr].no);
    printf("Adi:");
    scanf("%s", ogrenci[simdikiOgr].adi);
    printf("Soyadi:");
    scanf("%s", ogrenci[simdikiOgr].soyadi);
    printf("Vize:");
    scanf("%lf", &ogrenci[simdikiOgr].vize);
    printf("Final:");
    scanf("%lf", &ogrenci[simdikiOgr].final);
    ogrenci[simdikiOgr].notu = (ogrenci[simdikiOgr].vize * 0.4) + (ogrenci[simdikiOgr].final * 0.6);
    printf("Notu: %lf", ogrenci[simdikiOgr].notu);
    printf("\n\n");
    printf("Adi: %s\nNo: %d\nVize: %lf\nFinal: %lfNotu: %lf\n",
           ogrenci[simdikiOgr].adi, ogrenci[simdikiOgr].no, ogrenci[simdikiOgr].vize, ogrenci[simdikiOgr].final,
           ogrenci[simdikiOgr].notu);
}

int main() {
    int c;
    while (c != 5) {
        printf("\n1-\tYeni Kayit Ekle\n2-\tKayit Sil\n3-\tKayitlari Listele\n4-\tOrtalama Hesapla\n5-\tCikis\n");
        scanf(" %d", &c);
        Ogr *ogrenci;
        switch (c) {
            case 1:
                KayitEkle(ogrenci);
                break;
            case 2:
                KayitSil(ogrenci);
                break;
            case 3:
                KayitListele(ogrenci);
                break;
            case 4:
                OrtHesapla(ogrenci);
                break;
            case 5:
                printf("Cikiliyor");
                break;
            default:
                printf("Gecerli bir girdi yapiniz\n");
                break;
        }
    }

    return 0;
}

Как вы можете видеть, я использую malloc () и realloc () для моей структуры typedef и могу ввести только одну запись. Когда я попытался добавить новую запись (случай переключения: 1), она не работает и вылетает после этого раздела:

printf("No:");
scanf("%d", &ogrenci[simdikiOgr].no);

Сначала я попробовал использовать calloc (ogrenciSayisi * 10 * sizeof (Ogr)), но было создано только одно пространство. После этого в отладчике (CLion) после секции realloc указатель ogrenci становится нулевым указателем.

Edit: Я не пытаюсь вернуть значение. Как я знаю (int a) равно (int a []), поэтому KayitEkle (ogrenci) и void KayitEkle (Ogr ogrenci) кажутся мне законными. И мой ogrenci должен быть пустым, поэтому (Ogr * ogrenci = NULL) правильно, как вы сказали, верно?

Edit2: В разделе malloc 10 есть ошибка. Я починил это. Я пытался что-то, и я забыл удалить это.

Ответы [ 2 ]

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

Есть много ошибок. Если вы хотите динамически распределять память с помощью вашей функции. Указатель указателя должен быть использован, например, Инструкции в строке realloc также неверны, потому что, если перераспределение не удастся, вы перезаписываете старый адрес памяти, и указатель принимает то же значение, что и NULL.

И не выходя из темы. Вы также должны принять меры предосторожности с помощью функции scanf, если вы вводите что-либо, отличное от ожидаемого в формате (например, символы вместо цифр или наоборот) , это значит, что программа будет вести себя неопределенно, поэтому вы должны ожидать этот сценарий.

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

Вы передаете ogrenci указатель по значению в KayitEkle(), вы изменяете его значение внутри него, но не возвращаете его измененное значение в main().Вам нужно передать значение ogrenci с помощью указателя (т. Е. KayitEkle(&ogrenci)) или вернуть новое значение вызываемому (т. Е. ogrenci = KayitEkle(ogrenci)).Пример ниже с последним.Указатель ogrenci находится внутри цикла while, поэтому он будет инициализироваться каждый раз при запуске цикла, возможно, вы намеревались поместить его вне цикла, чтобы сохранить его значение.Локальные переменные имеют значение undefined (читай: any ) без инициализации, поэтому вам нужно явно инициализировать ogrenci в NULL, если вам нужно.См. Инициализация .Вам не нужно проверять ogrenciSayisi == 0, когда ogrenci == NULL, потому что realloc(NULL, ...) равно malloc(...).См. realloc .

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

typedef struct Ogrenciler {
    int no;
    char adi[50];
    char soyadi[50];
    double vize;
    double final;
    double notu;
} Ogr;

int ogrenciSayisi = 0;

// or void KayitEkle(Ogr **ogrenci) and then use *ogrenci
Ogr *KayitEkle(Ogr *ogrenci) {
    int simdikiOgr = ogrenciSayisi;

    ogrenciSayisi++;
    ogrenci = realloc(ogrenci, ogrenciSayisi*sizeof(Ogr));

    printf("No:");
    scanf("%d", &ogrenci[simdikiOgr].no);
    printf("Adi:");
    scanf("%s", ogrenci[simdikiOgr].adi);
    printf("Soyadi:");
    scanf("%s", ogrenci[simdikiOgr].soyadi);
    printf("Vize:");
    scanf("%lf", &ogrenci[simdikiOgr].vize);
    printf("Final:");
    scanf("%lf", &ogrenci[simdikiOgr].final);
    ogrenci[simdikiOgr].notu = (ogrenci[simdikiOgr].vize * 0.4) + (ogrenci[simdikiOgr].final * 0.6);
    printf("Notu: %lf", ogrenci[simdikiOgr].notu);
    printf("\n\n");
    printf("Adi: %s\nNo: %d\nVize: %lf\nFinal: %lfNotu: %lf\n",
           ogrenci[simdikiOgr].adi, ogrenci[simdikiOgr].no, ogrenci[simdikiOgr].vize, ogrenci[simdikiOgr].final,
           ogrenci[simdikiOgr].notu);
    return ogrenci;
}

int main() {
    int c = 0;
    Ogr *ogrenci = NULL;
    while (c != 5) {
        printf("\n1-\tYeni Kayit Ekle\n2-\tKayit Sil\n3-\tKayitlari Listele\n4-\tOrtalama Hesapla\n5-\tCikis\n");
        scanf(" %d", &c);
        switch (c) {
            case 1:
                ogrenci = KayitEkle(ogrenci);
                break;
            case 2:
                ogrenci = KayitSil(ogrenci);
                break;
            case 3:
                ogrenci = KayitListele(ogrenci);
                break;
            case 4:
                ogrenci = OrtHesapla(ogrenci);
                break;
            case 5:
                printf("Cikiliyor");
                break;
            default:
                printf("Gecerli bir girdi yapiniz\n");
                break;
        }
    }

    // it's nice to free things
    free(ogrenci);

    return 0;
}
...