web-dev-qa-db-fra.com

erreur: argument de type non valide de «unaire *» (avoir «int»)

J'ai un programme C:

#include <stdio.h>
int main(){
  int b = 10;             //assign the integer 10 to variable 'b'

  int *a;                 //declare a pointer to an integer 'a'

  a=(int *)&b;            //Get the memory location of variable 'b' cast it
                          //to an int pointer and assign it to pointer 'a'

  int *c;                 //declare a pointer to an integer 'c'

  c=(int *)&a;            //Get the memory location of variable 'a' which is
                          //a pointer to 'b'.  Cast that to an int pointer 
                          //and assign it to pointer 'c'.

  printf("%d",(**c));     //ERROR HAPPENS HERE.  

  return 0;
}    

Le compilateur génère une erreur:

error: invalid type argument of ‘unary *’ (have ‘int’)

Quelqu'un peut-il expliquer ce que signifie cette erreur?

26
picstand

Étant donné que c contient l'adresse d'un pointeur entier, son type doit être int**:

int **c;
c = &a;

L'ensemble du programme devient:

#include <stdio.h>                                                              
int main(){
    int b=10;
    int *a;
    a=&b;
    int **c;
    c=&a;
    printf("%d",(**c));   //successfully prints 10
    return 0;
}
21
codaddict

programme Barebones C pour produire l'erreur ci-dessus:

#include <iostream>
using namespace std;
int main(){
    char *p;
    *p = 'c';

    cout << *p[0];  
    //error: invalid type argument of `unary *'
    //peeking too deeply into p, that's a paddlin.

    cout << **p;    
    //error: invalid type argument of `unary *'
    //peeking too deeply into p, you better believe that's a paddlin.
}

ELI5:

Le maître met une pierre ronde brillante dans une petite boîte et la donne à un élève. Le maître dit: "Ouvrez la boîte et retirez la pierre". L'élève le fait.

Ensuite, le maître dit: "Maintenant, ouvrez la pierre et retirez la pierre". L'élève a dit: "Je ne peux pas ouvrir une pierre".

L'élève a ensuite été éclairé.

14
Eric Leschinski

J'ai reformaté votre code.

L'erreur se situait dans cette ligne:

printf("%d", (**c));

Pour y remédier, passez à:

printf("%d", (*c));

Le * récupère la valeur d'une adresse. Le ** récupère la valeur (une adresse dans ce cas) d'une autre valeur à partir d'une adresse.

De plus, le () était facultatif.

#include <stdio.h>

int main(void)
{
    int b = 10; 
    int *a = NULL;
    int *c = NULL;

    a = &b;
    c = &a;

    printf("%d", *c);

    return 0;
} 

MODIFIER:

La ligne :

c = &a;

doit être remplacé par:

c = a;

Cela signifie que la valeur du pointeur "c" est égale à la valeur du pointeur "a". Ainsi, "c" et "a" pointent vers la même adresse ("b"). La sortie est:

10

MODIFIER 2:

Si vous souhaitez utiliser un double *:

#include <stdio.h>

int main(void)
{
    int b = 10; 
    int *a = NULL;
    int **c = NULL;

    a = &b;
    c = &a;

    printf("%d", **c);

    return 0;
} 

Sortie:

10
5
Sandro Munda

Une fois que vous avez déclaré le type d'une variable, vous n'avez pas besoin de le convertir en ce même type. Vous pouvez donc écrire a=&b;. Enfin, vous avez incorrectement déclaré c. Puisque vous l'affectez comme étant l'adresse de a, où a est un pointeur vers int, vous devez le déclarer comme un pointeur vers un pointeur vers int.

#include <stdio.h>
int main(void)
{
    int b=10;
    int *a=&b;
    int **c=&a;
    printf("%d", **c);
    return 0;
} 
0
David Heffernan