Programação C: Problema - Programa crasha

wowmiguelfcp

Power Member
Boas malta.

Andei aqui numa de tirar o ferrugem em programação em C e dediquei-me a fazer uma pequena experiência.

E ora bem estou aqui com um problema e aposto que tem a ver com alocação de memória.

Ora bem eu tenho aqui uma função que se chama gerar_todas_chaves e um enxerto do código é este:

Código:
chave *todas_chaves;
todas_chaves     =     (chave *) malloc (116531800 * sizeof(chave));

for (i=0; i<116531800; i++)
    {
        //Gerar primeira chave, logo não há necessidade a ver se é repetida ou não
        if (i==0)
        {
            todas_chaves[i] = gerar_chave();
            todas_chaves[i] = ordenar_chave(todas_chaves[i]);
        }

A função gerar_chave e ordenar_chave retorna uma chave, chave esta que é definida por uma estrutura que defini.

O que acontece é que quando executa esta linha (todas_chaves = gerar_chave();) o programa crasha. Eu sei que tem a ver com a alocação, mas não consigo descobrir o erro. Já há muito que não programava também xD

Agradeço a vossa ajuda.
Cumprimentos
 
Eu já há muito que não programo em C ou C++

Consegues explicar-me para que serve este número?

Código:
todas_chaves = (chave *) malloc (116531800 * sizeof(chave));

for (i=0; i<116531800; i++)
 
Eu já há muito que não programo em C ou C++

Consegues explicar-me para que serve este número?

Código:
todas_chaves = (chave *) malloc (116531800 * sizeof(chave));

for (i=0; i<116531800; i++)


Basicamente o que estava a fazer era um programa que me fizesse as chaves todas possíveis do euromilhões xD foi apenas um exercício para me entreter e tirar o ferrugem como disse xD

Esse numero grande representa o número total de chaves possíveis no euromilhões. (se bem que esse numero vai mudar com a entrada da estrela 12)

Esse vetor irá armazenar em cada posição uma chave. Ele tem de ser declarado dessa forma pois é um vetor muito grande e daí ser necessário fazer uma alocação de memória.
 
A função gerar_chave retorna uma chave? Suponho que a estrutura chave esteja definida, certo?

Só por curiosidade, muda esse numero gigantesco para algo mais razoável tipo 20 e faz o teste novamente só para despistar problemas.
 
Estou um bocado enferrujado em C, mas porque criar um pointer e depois alocar memória, se podes fazer directamente:

Código:
struct chave todas_chaves[116531800];

Fica mais explícito. Mas no entanto experimenta ir comentando o código nas funções que colocam valores no array, pode o problema estar nessas funções..

Já agora, não necessitas de fazer cast ao malloc, e até pode "esconder" algum erro: http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc
 
A função gerar_chave retorna uma chave? Suponho que a estrutura chave esteja definida, certo?

Só por curiosidade, muda esse numero gigantesco para algo mais razoável tipo 20 e faz o teste novamente só para despistar problemas.


Sim essa função retorna uma chave e a estrutura está definida.

Posso experimentar isso por acaso ;) quando o fizer ponho cá os resultados ;) obrigado pela dica :)
 
Estou um bocado enferrujado em C, mas porque criar um pointer e depois alocar memória, se podes fazer directamente:

Código:
struct chave todas_chaves[116531800];

Fica mais explícito. Mas no entanto experimenta ir comentando o código nas funções que colocam valores no array, pode o problema estar nessas funções..


Porque o vetor é grande demais e não há memória suficiente na heap (acho eu que é aqui se não estou em erro). Sendo assim, tenho de alocar memória.
 
Já experimentei com 20 apenas e consegui por o programa a trabalhar normal, se bem que tive que passar a função gerar_todas_chaves para o main pois estava a ter problemas a passar os argumentos e retornar o vetor.

Depois experimentei a alocação para esse numero gigante e quando faz a primeira atribuição, ou seja, guardar o 1º numero da 1º chave, ele dá o crash.
 
quando utilizas mallocs, reallocks e coisas assim, antes de usares o pointer deves sempre verificar se está a null ou não, para evitar esse tipo de problemas.

Cumprimentos,
 
Back
Topo