如何为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->flag = flag;
无效......
在我设置之后,如果我打印NovoEstado->flag
我得到了正确的值,但是如果我在函数结束后将其放在for
之后,当我打印NovoEstado->flag
时,我得到了NovoEstado的第一个字符 - &gt; rotulo ...
当我尝试在flag
...
main()
时,会发生同样的情况
我认为这是因为我没有在flag
中为Insere()
正确分配内存空间,是吗?我该如何解决?
我很确定这是一个非常简单的问题,而且我有可能知道这一次,但我忘记了,无法在任何地方找到它......所以任何帮助都会非常感激
修改
按照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我与数据输入有关)
非常感谢
答案 0 :(得分:7)
你的问题可能就在这一行:
realloc(NovoEstado->instrucao, i+1*sizeof(char[2][10]));
不需要在结构中分配任何内容,因为字段instrucao
由语句instrucao[1][2][10]
静态定义,它不是动态分配的结构。
答案 1 :(得分:1)
我认为这一行是问题所在:
realloc(NovoEstado->instrucao, i+1*sizeof(char[2][10]));
在结构中,instrucao被定义为一块连续的内存,但你现在正在分配一个内存并分配指针。
尝试将其注释掉,您不需要为该变量分配内存。
答案 2 :(得分:0)
您不需要分配标志。它是在struct中定义的char(与指针相对)。
您的错误是由于在写入NovoEstado->instrucao
的for循环期间覆盖结构内部的标志内容(即内存涂鸦或覆盖)引起的。
更新:正如@ocdecio指出的那样,你不需要在循环中重新分配,因为instrucao
也是静态分配的。
答案 3 :(得分:0)
我不知道代码的意图,但执行以下操作当然是违法的:
realloc(NovoEstado-&gt; instrucao,i + 1 * sizeof(char [2] [10]));
基本上,包含的结构是使用malloc分配的,但是内部成员是一个静态定义的数组,并且不能使用堆重新定位(因为堆管理器只跟踪指向节点的malloced指针)。
typedef struct node {char rotulo [10], instrucao [1] [2] [10], flag;
如果您希望动态调整 instrucao 的大小,则必须将其定义为指针类型并单独为其分配内存。