문제

구조물 내부에서 숯 변수 (숯 포인터가 아님)에 대한 메모리를 어떻게 할당합니까?
(가변 이름은 포르투갈어로되어 있습니다. 혼란 스러우면 죄송합니다)

나는이 구조물이있다 :

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 ...
인쇄하려고 할 때도 마찬가지입니다 flag 안에 main()...

메모리 공간을 제대로 할당하지 않기 때문이라고 생각합니다. flag 안에 Insere(), 맞습니까? 그리고 어떻게 수정합니까?

나는 그것이 끔찍한 쉬운 질문이라고 확신하고, 나는 이것을 한 번 알았을 가능성이 있지만, 나는 잊어 버렸고 어디서나 그것을 찾을 수 없다 ... 그래서 어떤 도움을 주셔서 감사합니다.

편집하다

Ocdecio의 팁에 이어 Dinamic 3 차원 배열을 갖기 위해 2 차원 배열에 대한 포인터를 만들었습니다.
내 목표는 다음과 같은 "테이블"을 갖는 것입니다.

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

선의 수는 Dinamic이지만 항상 10 숯의 2 문자열 배열입니다.

이제 이것이 제가 메인에서하고있는 일입니다.

    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

뭐가 문제 야?

(누군가가 묻기 전에 이것은 이것이입니다 부분 숙제의 경우는 아니지만 그만큼 숙제. 내 임무는 결정 론적 유한 유한 Automata Minimizer를 만드는 것입니다. 이것은 데이터 입력과 관련된 버그 일뿐입니다).

감사합니다

도움이 되었습니까?

해결책

당신의 문제는이 라인에있을 것입니다.

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

필드이기 때문에 구조물 내부에 아무것도 할당 할 필요가 없습니다. instrucao 진술에 의해 정적으로 정의됩니다 instrucao[1][2][10], 그것은 동적으로 할당 된 구조가 아닙니다.

다른 팁

이 줄은 문제라고 생각합니다.

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

구조에서 instrucao는 연속 메모리의 덩어리로 정의되지만 이제 메모리를 할당하고 포인터를 할당하고 있습니다.

댓글을 달아보십시오. 해당 변수에 대한 메모리를 할당 할 필요가 없습니다.

깃발을 할당 할 필요가 없습니다. 구조물 내부에 정의 된 숯입니다 (포인터와 반대).

귀하의 오류는 당신이 작성하는 루프 동안 구조물 내부의 플래그 내용을 덮어 쓰는 것입니다. NovoEstado->instrucao (예 : 메모리 낙서 또는 덮어 쓰기).

업데이트 : @ocdecio가 지적했듯이, 당신은 루프 내부에서 재 할당 할 필요가 없습니다. instrucao 또한 정적으로 할당됩니다.

나는 코드의 의도를 모르지만 다음을 수행하는 것은 확실히 불법입니다.

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

기본적으로, 함유 구조는 Malloc을 사용하여 할당되었지만 문제의 내부 원인은 정적으로 정의 된 배열이며 힙을 사용하여 힙합 할 수는 없습니다 (힙 관리자는 노드에 대한 malloced 포인터 만 추적하기 때문에).

typedef struct 노드 {char rotulo [10], instrucao [1] [2] [10], 깃발;

크기를 조정하고 싶다면 instrucao 동적으로, 포인터 유형으로 정의하고이를 별도로 메모리를 할당해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top