繁体   English   中英

如何在C中的结构内设置字符?

[英]How to set a char inside a struct in C?

如何在结构内为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->flag = flag; 没用...
紧接着我将它,如果我打印NovoEstado->flag我得到正确的值,但如果我把它之后for由函数的最后,当我打印NovoEstado->flag我得到NovoEstado-的第一个字符> rotulo ...
当我尝试在main()打印flag ,也会发生同样的情况……

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

我很确定这是一个非常简单的问题,而且我可能一次也知道这一点,但是我忘记了并且在任何地方都找不到它...所以我们将不胜感激

编辑

遵循ocdecio的技巧,我创建了一个指向二维数组的指针,以便获得动态3维数组。
我的目标是要有一个像这样的“桌子”:

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

行数是动态的,但始终是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

怎么了?

(有人问过,这是一门功课的一部分 ,但不是功课。我的任务就是让一个确定有限自动最小化,这只是我越来越相关数据输入错误)

非常感谢

您的问题可能在以下这一行:

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

不需要在结构内部分配任何内容,因为instrucao字段是由语句instrucao[1][2][10]静态定义的,它不是动态分配的结构。

我认为这是问题所在:

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

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

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

您不需要分配标志。 它是在结构内部定义的一个字符(与指针相反)。

您的错误是由在for循环中写入NovoEstado->instrucao的for循环中覆盖了struct内部标志的内容引起的(即,它的内存NovoEstado->instrucao或覆盖)。

更新:@ocdecio指出,您不需要在循环内instrucao分配,因为instrucao也是静态分配的。

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

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

基本上,包含结构是使用malloc分配的,但是有问题的内部成员是静态定义的数组,无法使用堆进行重新分配(因为堆管理器仅跟踪指向节点的malloc指针)。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM