【问题标题】:Dynamic memory in C with structC中的动态内存与结构
【发布时间】:2016-12-29 17:26:40
【问题描述】:

我有这个代码,但它不起作用,怎么了? 我尝试制作大量具有动态大小的结构(C 语言) 在第二次使用 add_sala() 之后;在主要功能 Windows 关闭程序。 请帮忙解决这个问题!谢谢!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
char trash[50];
int dyn_sala_id=1;
typedef struct
{
    int id;
    char number[6];
    int persons;
    char tech_inf[256];
} sala;
sala *sala_;

int add_sala()
{
    int persons;
    char number[6], tech_inf[256];


    sala_ = (sala*)realloc(sala_,dyn_sala_id * sizeof(sala));

    printf("Wpisz numer sali(max. 5 znakow): ");
    fgets(number,6,stdin);
    if(strlen(number)>5)
    {
        printf("Numer musi byc nie wiecej, niz 5 znakow!\n");
        fflush(stdin);
        add_sala();
        return 0;
    }

    printf("Wpisz ilosc osob, ktora wmiesci sie w sale(max. 1000 osob): ");
    scanf("%d", &persons);
    if(persons==0 || persons>1000)
    {
        printf("Nie wolno wprowadzic litery oraz max. ilosc osob to 1000\n");
        fflush(stdin);
        add_sala();
        return 0;
    }

    printf("Wpisz info o wyposazeniu sali(max. 255 znakow): ");
    fgets(trash,50,stdin);
    fgets(tech_inf,256,stdin);
    if(strlen(tech_inf)>255)
    {
        printf("Info musi byc nie wiecej, niz 255 znakow!\n");
        fflush(stdin);
        add_sala();
        return 0;
    }

    sala_[dyn_sala_id].id = dyn_sala_id;
    strncpy(sala_[dyn_sala_id].number, number, 6);
    sala_[dyn_sala_id].persons = persons;
    strncpy(sala_[dyn_sala_id].tech_inf, tech_inf, 256);
    printf("\nSala zostala dodana!\n\n");
    printf("%d, %d, %s, %s",dyn_sala_id, persons, number, tech_inf);
    dyn_sala_id+=1;
    return 0;
}

int main()
{
    add_sala();
    printf("%s",sala_[1].number);
    add_sala();
    printf("'%s'",sala_[1].number);
    printf("'%s'",sala_[2].number);
    return 0;
}

【问题讨论】:

标签: c memory dynamic struct


【解决方案1】:

C 中的数组从0 开始索引,因此在main() 中,数组索引减1。

add_sala();
printf("%s",sala_[1].number);
add_sala();
printf("'%s'",sala_[1].number);
printf("'%s'",sala_[2].number);

同样在函数add_sala() 中,很明显,第一次调用它时,你有全局

int dyn_sala_id=1;

你用来为一个记录分配内存

sala_ = (sala*)realloc(sala_,dyn_sala_id * sizeof(sala));

但再往下一点,索引又偏离了 1,显然只有一个数组元素

sala_[dyn_sala_id].id = dyn_sala_id;

然后,在同一个函数中(尽管我无法阅读错误消息),在明显错误的输入之后递归函数似乎很奇怪。此外,您有 未定义的行为

fflush(stdin);

我没有进一步看,因为代码不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 2017-10-25
    • 2011-01-30
    • 1970-01-01
    相关资源
    最近更新 更多