DÚVIDA - Linguagem C

6 respostas
D

Olá pessoal,

Estou fazendo um programa que tenha malloc, com o objetivo de entender BEM como funciona e como é o código de lista ligada…

Bom, lendo uma apostila, eu fiz o seguinte o código:

#include <iostream.h>
#include <stdio.h>
#include <alloc.h>
#include <stdlib.h>

int main()
{
      int *v, n, i;
      printf("Tamanho do vetor?\n");
      scanf("%d", &n);
      v = malloc( n*sizeof(int) );
      if(v!=NULL)
            exit(1);
      for(i = 0; i<n; i++){
            printf("\n%do. valor?");
            scanf("%d", &v[i]);
      }
      while(i>=0)
            printf("%d", v[--i]);

      system("PAUSE");
      return 0;
}

Surge um erro:
[color=red]Line: 11
Message: ANSI C++ forbids implicit conversion from ‘void *’ in assignment[/color]

Tentei outro código:

#include <iostream.h>
#include <stdio.h>
#include <alloc.h>
#include <stdlib.h>

void main(void)
{
      char *p;
      p = malloc(100*sizeof(char));
      if(p==NULL){
           puts("Memoria Insuficiente");
           exit(1);
      }

      system("PAUSE");
      return 0;
}

Deu o mesmo erro, mas na linha 9 :?

Alguém poderia me dizer o pq desse erro?? :frowning:

Agradeço desde já!

6 Respostas

peczenyj

A função malloc retorna um ponteiro do tipo (void *) e, em C++, vc precisa fazer o cast explicito para o tipo de ponteiro que vc deseja, senão dá esse erro.

Aqui está explicado melhor:

T

A tal apostila é bem velhinha*, não?
Não se usa mais #include <iostream.h> (faz quanto tempo que já vi isso?), e sim

#include <iostream>
...
using namespace std;

No seu caso, você pode usar uma das duas alternativas:

// Não recomendável em C++ - só em C
v = (int *) malloc( n*sizeof(int) );
// O estilo recomendado em C++.
v = new int[n];

Da mesma forma:

// Não recomendável em C++ - só em C
  p = (char *) malloc(100*sizeof(char));
// O estilo recomendado em C++.
  p = new char [100];

Cuidado - ambas as alocações de memória não limpam os arrays. Portanto é sempre recomendável zerar os arrays antes, para evitar problemas (já tive muitos, quando tive de fazer um programa em C++ depois de anos usando só Java).
Para zerar os arrays, ou você usa “calloc” (que aloca e zera em uma única chamada), ou então “memset” (que só zera).

EDIT * Agora vi que a apostila, fora ser velha, parece estar bugada. Não existia conversão automática de void* para int* mesmo em C++ 1.0, se não me engano (infelizmente não tenho nenhum compilador Cfront aqui para confirmar isso.)

Luca

Olá

Parece que falta um cast:

p = (char*) malloc(100*sizeof(char));

ou

v = (int*) malloc( n*sizeof(int) );

Mas verifique melhor seus conceitos porque faz mais de 4 anos que não escrevo nada em C/C++.

[]s
Luca

D

Pessoal, mto obrigada!! :smiley:
Deu certo!! :slight_smile:

Valeuuuuu!

Boa noite a todos!

peczenyj

thingol:
Cuidado - ambas as alocações de memória não limpam os arrays. Portanto é sempre recomendável zerar os arrays antes, para evitar problemas (já tive muitos, quando tive de fazer um programa em C++ depois de anos usando só Java).
Para zerar os arrays, ou você usa “calloc” (que aloca e zera em uma única chamada), ou então “memset” (que só zera).

Quem deveria zerar os arrays é o sistema operacional, até por uma questão de segurança.

T

peczenyj:
thingol:
Cuidado - ambas as alocações de memória não limpam os arrays. Portanto é sempre recomendável zerar os arrays antes, para evitar problemas (já tive muitos, quando tive de fazer um programa em C++ depois de anos usando só Java).
Para zerar os arrays, ou você usa “calloc” (que aloca e zera em uma única chamada), ou então “memset” (que só zera).

Quem deveria zerar os arrays é o sistema operacional, até por uma questão de segurança.

a) O sistema operacional é responsável por zerar apenas os grandes buffers de memória que ele aloca para seu programa. Os pequenos buffers (alocados com malloc, new etc.) são de responsabilidade do runtime do C++.
b) Por razões de segurança, é melhor então usar calloc ou new. (No caso de “new”, tente sempre definir um construtor que deixe um objeto com todos os campos zerados corretamente.)

Criado 11 de junho de 2007
Ultima resposta 12 de jun. de 2007
Respostas 6
Participantes 4