web-dev-qa-db-fra.com

C: impossible d'initialiser la variable avec une valeur r de type void *

J'ai le code suivant:

int *numberArray = calloc(n, sizeof(int));

Et je n'arrive pas à comprendre pourquoi je reçois l'erreur suivante.

Cannot initialize a variable of type 'int *' with an rvalue of type 'void *'`.

Je vous remercie.

12
user3662185

Le message d'erreur du compilateur est très clair.

La valeur de retour de calloc est void*. Vous l'affectez à une variable de type int*.

C'est correct avec un programme C, mais pas avec un programme C++.

Vous pouvez changer cette ligne en

int* numberArray = (int*)calloc(n, sizeof(int));

Mais, une meilleure alternative sera d'utiliser l'opérateur new pour allouer de la mémoire. Après tout, vous utilisez C++.

int* numberArray = new int[n];
19
R Sahu
void* calloc (size_t num, size_t size);

Allouer et initialiser le tableau à zéro. Alloue un bloc de mémoire pour un tableau d'éléments num, chacun de taille octet long, et initialise tous ses bits à zéro.Le résultat effectif est l'allocation d'un bloc de mémoire initialisé à zéro d'octets (num * size).

En cas de succès, un pointeur sur le bloc mémoire alloué par la fonction. Le type de ce pointeur est toujours vide *, qui peut être converti en le type de pointeur de données souhaité afin d'être déréférencable. Si la fonction n'a pas pu allouer le bloc de mémoire demandé, un pointeur nul est renvoyé.

Pour résumer, puisque calloc renvoie un void* (pointeur générique) en cas de succès de l'allocation de mémoire, vous devrez le transtyper comme ceci en C++:

int *numberArray = (int*)calloc(n, sizeof(int));

Si c'était C, vous pouvez toujours ignorer cette distribution.

Ou utilisez new comme:

int *numberArray = new int [n];
2
user2734982

Vous utilisez le style de réallocation de mémoire C dans un code C++. Ce que vous voulez utiliser est new en C++

Votre code deviendra donc:

int n = 10; //n = size of your array
int *narray = new int[n];
for (int i = 0; i < n; i++)
    cout << narray[i];

Vous pouvez également revenir à C et utiliser calloc avec le casting.

int* numberArray = (int*)calloc(n, sizeof(int));
0
AK_

La syntaxe de calloc est:

void * calloc (size_t num, size_t size);

calloc renvoie un pointeur vide. Dans votre code, vous essayez d'attribuer un pointeur vide à un pointeur entier. Vous obtenez donc Impossible d'initialiser une variable de type 'int *' avec une valeur de type 'void *'. Donc, transformez le pointeur vide avant de l'attribuer comme ceci

* numberArray = (int *) calloc (n, sizeof (int));

0
Hussain