[Resolvido] Problema com alocação dinâmica em C

Boa tarde,
pois bem, estou tentando fazer uma alocação dinâmica de uma matriz tridimensional, só que meu código está dando erro de runtime.

[code]#include <stdio.h>
#include <stdlib.h>

void main()
{
int ***vetor,
*nodos;
int grafos,
num = 0;

scanf("%i", &grafos);

if((**vetor = (int*) malloc(sizeof(int*) * grafos)) /* erro aqui */ 
&& (nodos = (int*) malloc(sizeof(int)  * grafos)))
{		
	while(num <= grafos)
	{
		scanf("%i", nodos[num]);
		
		if(*vetor[num] = (int*) malloc(sizeof(int*) * nodos[num]))
		{
			int i;
			
			for(i = 0;i<nodos[num];i++)
			{
				if(vetor[num][i] = (int*) malloc(sizeof(int) * nodos[num]));
				else
				{
					printf("Erro na alocacao de memoria.\n");
					exit(-1);
				}
			}
		}
		else
		{
			printf("Erro na alocacao de memoria.\n");
			exit(-1);
		}
	}
}
else
{
	printf("Erro na alocacao de memoria.\n");
	exit(-1);
}

}[/code]

Alguém tem idéia do que possa estar causando o problema?

Use C++ e boost::shared_ptr e liberte-se do malloc. Ele é uma das razões pelas quais eu não gosto de programar em C puro; nunca sei por que é que dá o tal erro de execução sem perder alguns dias (ou até semanas) - na prática, jogo o código fora e escrevo em C++.

primeiro, não tenho certeza, mas não se pode declarar vetores de 3 dimensões e de apenas 1 na mesma linha.

int*** vetor;
    int* nodos;
    int grafos, num = 0;

Já que int*** é um tipo bem diferente de int*

e esta faltando o & no

scanf("%i", &nodos[num]);

muda o retorno de void pra int, e coloca um return 0; no final.

Não vou dizer que a idéia não seja boa, mas como se trata de um trabalho de faculdade e nem todos dominam C++, isso não é uma opção para mim. :frowning:

De qualquer forma, obrigada.

[quote=MaikoID]primeiro, não tenho certeza, mas não se pode declarar vetores de 3 dimensões e de apenas 1 na mesma linha.

int*** vetor;
    int* nodos;
    int grafos, num = 0;

Já que int*** é um tipo bem diferente de int*[/quote]

Será esse o problema? Vou testar mudar a declaração.

Sobre o &… Meu código não chega a passar da alocação de ***vetor.

Pensei que fosse problema de compilaçao… vou dar uma olhada na execuçao agora.

abraço.

Dei uma ajeitada no seu código, agora deve executar sem problemas. Por favor, arrume-o para tratar os erros de alocação - tirei essa parte para poder enxergar o que deveria ser feito.

#include <stdio.h>  
#include <stdlib.h>  
  
void main()  
{  
    int ***vetor,  
        *nodos;  
    int grafos,  
        num;  
    int i;
          
    puts ("Entre com o numero de grafos:");
    scanf("%i", &grafos);  
    
    // Atencao, para simplificar nao estou testando se malloc retornou NULL ou nao.
    // Teste se esta de acordo com o que voce quer, e depois ponha o tratamento de NULL.
    // Outra coisa que ajuda muito eh usar calloc em vez de malloc, porque
    // ele ja deixa a memoria inicializada com zeros, o que ajuda muito a resolver problemas
    // de tempo de execucao. Para seu uso, a diferenca de tempo eh absolutamente negligenciavel.
    vetor = (int***) calloc (grafos, sizeof (int **));
    nodos = (int*) calloc (grafos, sizeof (int));
    for (num = 0; num < grafos; ++num) {
        printf ("Entre com o numero de nodos do grafo %d\n", num);
        scanf ("%i", &nodos[num]);
        vetor [num] = (int**) calloc (nodos[num], sizeof (int *));
        for (i = 0; i < nodos[num]; ++i) {
            vetor [num][i] = (int*) calloc (nodos[num], sizeof (int));
        }
    }
}

[quote=enantiomero]Dei uma ajeitada no seu código, agora deve executar sem problemas. Por favor, arrume-o para tratar os erros de alocação - tirei essa parte para poder enxergar o que deveria ser feito.
[/quote]
Obrigada pela ajuda e pelas dicas! Consegui achar e resolver o problema com base no código que vc refez. :slight_smile: