[英]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.