J'ai du mal à comprendre char (*(*a)())[]

int main()
{    
    char (*(*a)())[]; // do not change this

    char *x="My endless\n";

    char *  func (){
        return(x);
    }

    a=func;
    return 0;
}

Lorsque je compile, je reçois un avertissement comme suit:
main.c: 13: 6: avertissement: affectation d'un type de pointeur incompatible [-Wincompatible-pointer-types]

Qui fait référence à a=func

Je sais que char (*(*a)()) signifie un pointeur vers une fonction qui renvoie un pointeur char mais je ne sais pas ce que l'addition de [] lui fait, c'est-à-dire char (*(*a)())[];

0
Shaveen De Silva 25 avril 2020 à 12:02

2 réponses

Meilleure réponse

Cette

char (*(*a)())[];

Est une déclaration d'un pointeur vers une fonction qui renvoie un pointeur vers un tableau de type incomplet char[].

Faites attention à ce que la définition de fonctions dans une autre fonction n'est pas une fonctionnalité C standard.

Voici un programme démonstratif qui compile au moins.

#include <stdio.h>

char ( *f() )[]
{
    static char s[][10] =
    {
        "Hello",
        "World"
    };

    return s;
}

int main(void) 
{
    char (*(*a)())[] = f;

    char ( *p )[] = a();

    puts( *p );

    return 0;
}

La sortie du programme est

Hello

Dans ce programme utilisant le casting comme

char ( *p )[10] = ( char ( * )[10] ) a();

Vous pouvez obtenir un pointeur vers un type de tableau complet.

2
Vlad from Moscow 25 avril 2020 à 09:26

Pour déchiffrer des déclarations C compliquées, vous pouvez utiliser la règle de la spirale, voir http: // c-faq .com / decl / spiral.anderson.html. Il existe également un outil pour traduire les déclarations C en anglais simple:

https://cdecl.org/

En général, il est préférable de diviser une déclaration compliquée en parties et de leur donner des noms significatifs, par exemple

#include <stdlib.h>

typedef char (*ArrayPointer)[];
typedef ArrayPointer (*Function)();

int main(void)
{
    char (*(*a)())[] = NULL;
    Function b;

    b = a;
    return 0;
}
2
August Karlstrom 25 avril 2020 à 09:29