如何为struct中的char变量(不是char指针)分配内存?
(变量名称是葡萄牙语,抱歉,如果它有点令人困惑)

我有这个结构:

typedef struct node{
    char rotulo[10], instrucao[1][2][10], flag;
    int simplificado;

    struct node *referencias[2];
    struct node **antecessores;
    int nrAntecessores;

    struct node *ant;
    struct node *prox;
} Estado;

这是函数 insere(),用于设置从新节点中的输入文件读取的值:

void Insere(char *rotulo, char instrucao[][2][10], int qtdInstrucao, char flag){
    int i,j;
    Estado *NovoEstado;
    NovoEstado = (Estado*)malloc(sizeof(Estado));
    NovoEstado->prox = NULL;
    NovoEstado->ant = P->ult;
    strcpy(NovoEstado->rotulo, rotulo);
    NovoEstado->flag = flag;
    NovoEstado->antecessores = NULL;
    NovoEstado->nrAntecessores = 0;
    NovoEstado->simplificado = 0;

    for(i=0;i<qtdInstrucao;i++){
        realloc(NovoEstado->instrucao, i+1*sizeof(char[2][10]));
        strcpy(NovoEstado->instrucao[i][0], instrucao[i][0]);
        strcpy(NovoEstado->instrucao[i][1], instrucao[i][1]);
    }
}

NovoEstado-&gt; flag = flag; 无效...
在我设置之后,如果我打印 NovoEstado-&gt; flag ,我得到正确的值,但是如果我在函数结束之后将放在之后,那么我打印 NovoEstado-&gt; flag 我得到了NovoEstado的第一个字符 - &gt; rotulo ...
当我尝试在 main()中打印 flag 时会发生同样的情况......

我认为那是因为我没有在 Insere()中为 flag 正确分配内存空间,是吗?我该如何解决?

我很确定这是一个非常简单的问题,而且我有可能知道这一次,但我忘记了,无法在任何地方找到它......所以任何帮助都会非常感激

修改

根据ocdecio的提示,我创建了一个指向二维数组的指针,以便拥有一个dinamic 3维数组。
我的目标是拥有一张“桌子”。像这样:

  10 chars | 10 chars  
|__________|__________|
|__________|__________|
|__________|__________|

其中行数是dinamic,但它总是由2个10个字符串组成的数组。

所以现在这就是我在做的主要内容:

    char estado[127], rotulo[10], strInstrucoes[117], *conjunto = calloc(21, sizeof(char)), flag;
    char (*instrucao)[2][10];

    FILE * entrada;
    Automato *Aut = (Automato*)malloc(sizeof(Automato));

    if((entrada = fopen(argv[1], "r")) != NULL){
        CriaAutomato(Aut);
        while(fgets(estado, 127, entrada)){
            flag = 0;
            sscanf(estado,"%[^:]: %[^;]; %c", rotulo, strInstrucoes, &flag);
            instrucao = calloc(1, sizeof(char[2][10]));
            conjunto = strtok(strInstrucoes,"() ");
            for(i = 0; conjunto != NULL; i++){
                realloc(instrucao, i+1*sizeof(char[2][10]));
                sscanf(conjunto,"%[^,],%s", instrucao[i][0], instrucao[i][1]);
                printf("%s || %d\n", instrucao[i][1], i);
                conjunto = strtok(NULL, "() ");
            }
            Insere(Aut, rotulo, instrucao, i, flag);
            free(instrucao);
        }
        fclose(entrada);

但这不起作用......
这是从文件

读取的输入
adsasdfg2: (abc,123) (def,456) (ghi,789);

但是甚至在我调用 Insere 之前我没有按照我想要的方式将正确的值分配给 instrucao ,因为这是 printf <的输出/代码>

123
454
789

而不是我的目标

123
456
789

怎么了?

(在某人问之前,这是部分的作业,但不是 作业。我的任务是制作一个确定性有限自动机最小化器,这只是一个bug我与数据输入有关)

非常感谢

有帮助吗?

解决方案

你的问题可能就在这一行:

realloc(NovoEstado->instrucao, i+1*sizeof(char[2][10]));

没有必要在你的结构中分配任何东西,因为字段 instrucao 是由语句 instrucao [1] [2] [10] 静态定义的,它是不是动态分配的结构。

其他提示

我认为这一行是问题所在:

realloc(NovoEstado->instrucao, i+1*sizeof(char[2][10]));

在结构中,instrucao被定义为一块连续的内存,但你现在正在分配一个内存并分配指针。

尝试将其注释掉,您不需要为该变量分配内存。

您不需要分配标志。它是在struct中定义的char(与指针相对)。

您的错误是由于在您编写 NovoEstado-&gt; instrucao (即内存涂鸦或覆盖)的for循环期间覆盖结构内的标志内容引起的。

更新:正如@ocdecio指出的那样,你不需要在循环中重新分配,因为 instrucao 也是静态分配的。

我不知道代码的意图,但执行以下操作当然是违法的:

realloc(NovoEstado-&gt; instrucao,i + 1 * sizeof(char [2] [10]));

基本上,包含结构是使用malloc分配的,但是所讨论的内部成员是静态定义的数组,并且不能使用堆重新定位(因为堆管理器仅跟踪指向节点的malloced指针)。

typedef struct node {char rotulo [10], instrucao [1] [2] [10], flag;

如果您希望动态调整 instrucao 的大小,则必须将其定义为指针类型并单独为其分配内存。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top