Macbook m1芯片上的分段故障11

t9aqgxwy  于 2023-03-12  发布在  Mac
关注(0)|答案(2)|浏览(215)

我有一个问题,我不知道是否是我的MacBook或我的代码的问题。谢谢你的帮助!
我也试着看了一下设置,我真的不明白为什么不工作,为什么会出现这个错误。我是初学者,我有大学同事的代码
我真的不知道该给予哪些细节,我一直在寻找,但没有找到答案
我卸载了vscode并安装。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Farmacie
{
    char *denumire;
    int nr_angajati;
    float *salarii;
    int an_infiintare;
};
struct Farmacie initializare(const char *denumire, int nr_angajati, float *salarii, int an_infiintare)
{
    struct Farmacie f;
    f.nr_angajati = nr_angajati;
    f.an_infiintare = an_infiintare;
    f.denumire = malloc((strlen(denumire) + 1) * sizeof(char));
    strcpy(f.denumire, denumire);
    f.salarii = malloc(sizeof(float) * nr_angajati);
    for (int i = 0; i < nr_angajati; i++)
    {
        f.salarii[i] = salarii[i];
    }
    return f;
}

void afisareFarmacie(struct Farmacie f)
{
    printf("Denumire: %s, infiintata in: %d", f.denumire, f.an_infiintare);
    printf(", nr. angajati: %d, cu salariile: ", f.nr_angajati);
    for (int i = 0; i < f.nr_angajati; i++)
        printf("%5.2f, ", f.salarii[i]);
    printf("\n");
}
struct Farmacie copiere(const struct Farmacie f2)
{
    struct Farmacie aux;
    aux.an_infiintare = f2.an_infiintare;
    aux.nr_angajati = f2.nr_angajati;
    aux.denumire = malloc((strlen(f2.denumire) + 1) * sizeof(char));
    strcpy(aux.denumire, f2.denumire);
    aux.salarii = malloc(sizeof(float) * f2.nr_angajati);
    for (int i = 0; i < f2.nr_angajati; i++)
    {
        aux.salarii[i] = f2.salarii[i];
    }
    return aux;
}

struct Farmacie *adaugaFarmacieInVector(struct Farmacie *farmacii, struct Farmacie f, int *nr)
{
    *nr = *nr + 1;
    struct Farmacie *aux = malloc(sizeof(struct Farmacie) * (*nr));
    for (int i = 0; i < *nr - 1; i++)
        aux[i] = farmacii[i];
    aux[*nr - 1] = copiere(f);
    return aux;
}

int calculNrAngajati(struct Farmacie *farmacii, int nr)
{
    int nrTotalAngajati = 0;
    for (int i = 0; i < nr; i++)
    {
        nrTotalAngajati += farmacii[i].nr_angajati;
    }
    return nrTotalAngajati;
}

struct Farmacie citireFisier(FILE *f)
{
    struct Farmacie aux;
    char buffer[30];
    fscanf(f, "%s", buffer);
    aux.denumire = malloc(strlen(buffer) + 1);
    strcpy(aux.denumire, buffer);
    fscanf(f, "%d", &aux.nr_angajati);
    aux.salarii = malloc(sizeof(float) * aux.nr_angajati);
    for (int i = 0; i < aux.nr_angajati; i++)
    {
        fscanf(f, "%f", &aux.salarii[i]);
    }
    fscanf(f, "%d", &aux.an_infiintare);
    return aux;
}

int main()
{

    FILE *file = fopen("farmacie.txt", "r");
    struct Farmacie fis = citireFisier(file);

    afisareFarmacie(fis);
}
toiithl6

toiithl61#

当你的程序试图访问不属于它的内存时,Segmentation Fault就会发生,这可能是当你试图访问一个悬空指针(一个内存已经被释放的指针)或者当你试图访问一个空指针时,当一个错误发生时,比如当那个文件不存在时,fopen就会返回空指针。
因此,在程序中使用从fopenmalloc等接收到的指针之前,最好先检查它们,如下所示:

FILE *file = fopen("farmacie.txt", "r");
    if (!file) {
         //handle error
    }

也许可以尝试使用gdb运行程序,并查看回溯,看看它失败的地方。

oxiaedzo

oxiaedzo2#

1.我不会返回结构(或将它们作为参数),因为这是非常昂贵的

  1. C程序需要检查错误条件(并且您的代码中缺少大量的if:))
typedef struct Farmacie
{
    char *denumire;
    size_t nr_angajati;
    float *salarii;
    int an_infiintare;
}Farmacie;

#define MAXSTRINGLENGTH     30

void afisareFarmacie(Farmacie *f)
{
    if(f && f -> denumire && f -> salarii)
    {
        printf("Denumire: %s, infiintata in: %d", f -> denumire, f -> an_infiintare);
        printf(", nr. angajati: %d, cu salariile: ", f -> nr_angajati);
        for (size_t i = 0; i < f -> nr_angajati; i++)
            printf("%5.2f, ", f -> salarii[i]);
        printf("\n");
    }
    else printf("Invalid data\n");
}

Farmacie *citireFisier(FILE *f)
{
    Farmacie *aux;

    if(f)
    {
        aux = malloc(sizeof(*aux));
        if(aux)
        {
            aux -> denumire = malloc(MAXSTRINGLENGTH * sizeof(aux -> denumire[0]));  // do not save memry here
            if(!aux -> denumire) { /* handle allocation error */}
        
            if(!fgets(aux -> denumire, MAXSTRINGLENGTH, f))  { /* handle I/O error */}
            if(fscanf(f, "%zu", &aux -> nr_angajati) != 1)  { /* handle I/O error */}
            aux -> salarii = malloc(sizeof(aux -> salarii[0]) * aux -> nr_angajati);
            if(!aux -> salarii) { /* handle allocation error */}
            for (size_t i = 0; i < aux -> nr_angajati; i++)
            {
                if(fscanf(f, "%f", &aux -> salarii[i]) != 1) { /* handle I/O error */}
            }
            if(fscanf(f, "%d", &aux -> an_infiintare) != 1) { /* handle I/O error */}
        }
    }
    return aux;
}

int main(void)
{

    FILE *file = fopen("farmacie.txt", "r");
    Farmacie *fis = citireFisier(file);

    afisareFarmacie(fis);
    if(file) fclose(file);
    free(fis);
}

相关问题