Alocação Dinamica [RESOLVIDO]

1. Alocação Dinamica [RESOLVIDO]

Augusto
LinuxMH

(usa BackTrack)

Enviado em 25/06/2013 - 11:39h

Bom compilei, mas ele fala que faz uma conversão de void para int, não entendi
#include <iostream>

using namespace std;
#include <stdlib.h>
int main()
{
int *p;
p = malloc (5 * sizeof(int));
for(int i=0; i<5; i++)
cin >>p[i];
for(int i=0; i<5; i++)
cout <<p[i];
free(p);


}


Erro
alocacao.cpp:8: error: invalid conversion from ‘void*’ to ‘int*’



  


2. MELHOR RESPOSTA

Uilian Ries
uilianries

(usa Linux Mint)

Enviado em 25/06/2013 - 12:19h

Tentou um casting no malloc?


p = (int *) malloc (5 * sizeof(int));


3. Re: Alocação Dinamica [RESOLVIDO]

Augusto
LinuxMH

(usa BackTrack)

Enviado em 25/06/2013 - 12:33h

Ixi, tinha esqueci desse detalhe, vlw


4. Re: Alocação Dinamica [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 25/06/2013 - 14:21h

Note uma coisa: em C não é necessário fazer conversão de tipo de void* para nenhum outro tipo de ponteiro. Veja o código abaixo, que é perfeitamente válido em C, mas inválido em C++.

/* Este programa é um programa em C que NÃO É VÁLIDO EM C++! */

char *pc=malloc(100*sizeof *pc);
int *pi=malloc(100*sizeof *pi);
double *pd=malloc(100*sizeof *pd);

/* ... algum código que usa os ponteiros acima ... */

free(pd);
free(pi);
free(pc);


Como você está usando C++, o código acima não vale. Contudo, a melhor forma de corrigi-lo não é sair colocando conversões de tipo para todo lado, mas sim usar a forma C++ de fazer alocação dinâmica, como os operadores new e new[] para alocar, e delete ou delete[] para desalocar. Isso elimina completamente a necessidade das conversões de tipo.

// Este é um programa em C++ que não usa o estilo de alocação do C.

char *pc=new char[100];
int *pi=new int[100];
double *pd=new double[100]https://maps.google.com/;

/* ... algum código que usa os ponteiros acima ... */

delete[] pd;
delete[] pi;
delete[] pc;


Se for para usar arrays dinâmicos, eventualmente você pode até preferir a biblioteca padrão de modelos do C++ (STL), valendo-se da conveniência de std::vector em lugar de ter de alocar e desalocar ponteiros explicitamente.

Quanto a conversões de tipo, a boa prática em C++ recomenda não usar o estilo do C, mas operadores que deixam essas conversões mais visíveis, determinam sua natureza (estática, dinâmica, constante ou completamente arbitrária) e dão algum nível de garantia de que a conversão de tipos é segura. No caso do seu código, se você de modo nenhum quiser usar new[]/delete[], considere pelo menos usar a conversão de tipos no estilo do C++.

// A conversão com static_cast<> é segura de funcionar em qualquer máquina.
int *pi=static_cast<int *>(malloc(100*sizeof *pi));

/* ... bla, bla, bla ... */

free(pi);


Ainda com relação a estilo, programas em C++ que usam a biblioteca padrão do C devem preferir incluir cabeçalhos para ela que incluem as transformações necessárias para o C++. Assim, em lugar de #include <stdlib.h>, é preferível usar #include <cstdlib>.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts