Struct 两个结构,一个引用另一个

Struct 两个结构,一个引用另一个,struct,Struct,我想知道为什么此函数无效地籍无线电(R\u cidade**q)不打印数据您为主要结构分配的存储,而不是次要结构。改变 typedef struct Radios_Frequencia { char tipo_radio[3]; int qt_radio; int frequencia; }Radiof; typedef struct Radio_Cidade { char nome_cidade[30]; char nome_radio[30];

我想知道为什么此函数
无效地籍无线电(R\u cidade**q)
不打印数据

您为主要结构分配的存储,而不是次要结构。改变

typedef struct Radios_Frequencia {
    char tipo_radio[3];
    int qt_radio;
    int frequencia;

}Radiof;
typedef  struct Radio_Cidade  {
    char nome_cidade[30];
    char nome_radio[30];
    char dono_radio[3];
    int numero_horas;
    int audiencia;
    Radiof *fre;

}R_cidade;



void Cadastrar_Radio(R_cidade**q){
    printf("%d\n",i);

    q[0]=(R_cidade*)malloc(sizeof(R_cidade));
    printf("informa a frequencia da radio\n");
    scanf("%d",&q[0]->fre->frequencia);  //problem here
    printf("%d\n",q[0]->fre->frequencia); // problem here




}
致:


这将分配两者。如果没有这一点,
fre
很有可能指向never never land(如“由于它是未定义的行为,您永远无法知道将发生什么)。

您已经分配了一些存储,但尚未正确初始化任何存储

只有将可靠的值放入结构中,才能得到可靠的打印内容

此外,还指出,您已经为
R\u cidade
结构分配了空间,但没有为它的
Radiof
组件分配空间。您正在使用
scanf()
将一个值读入尚未分配的空间;这是不可靠的-最多是未定义的行为,但通常是内核转储时间

请注意,尽管这两种类型是链接的,但C编译器肯定不会对
Radiof
进行任何分配,因为
R\u-cidade
提到了它。它无法判断
R\u-cidade
中的指针是指向单个结构还是指向一个结构数组的开头,因此无法判断如何分配要分配的空间太多。此外,您可能不希望每次都初始化该结构-您可能会很高兴没有指向任何地方(空指针),除非在某些只有您知道的特殊情况下

您还应该验证内存分配是否成功,或者使用一个内存分配器来保证永远不会返回空指针或无效指针。通常,这可能是标准
malloc()
函数的覆盖函数:

q[0]=(R_cidade*)malloc(sizeof(R_cidade));
q[0]->fre = malloc(sizeof(Radiof));
q[0]=(R_cidade*)malloc(sizeof(R_cidade));
q[0]->fre = malloc(sizeof(Radiof));
#undef NDEBUG
#include <assert.h>

void *emalloc(size_t nbytes)
{
    void *space = malloc(nbytes);
    assert(space != 0);
    return(space);
}
#include "stderr.h"

void *emalloc(size_t nbytes)
{
    void *space = malloc(nbytes);
    if (space == 0)
        err_error("Out of memory\n");
    return space;
}