2010-09-09 5 views
1

considère le code suivant:tableau comme argument de la fonction

#define MAX_COUNT 4 
static int foo(int w[MAX_COUNT]) 
{ 
    int *p = w; 

    if (w) { 
     w[0] = 10; w[1] = 20; w[2] = 30; w[3] = 40; 
    } 

    return 0; 
} 

est-il NULL passe portable et juridique ci-dessus foo définie() (par exemple, pour une situation où je ne ai pas besoin w [] être modifié)? Étant donné que le nom d'un tableau est un pointeur vers son premier élément, il me semble que cela devrait être OK, mais perhpas il me manque quelque chose?

Merci!

+0

Quel est le problème auquel vous êtes confronté? Le programme ne compile-t-il pas ou est-ce la sortie? –

Répondre

1

Ça devrait aller. Le nombre d'éléments dans le tableau que vous avez passé est simplement un formalisme, et pas vraiment nécessaire. w est juste un pointeur vers int. Il n'y a pas d'autre vérification d'exécution ou de compilation.

4

En C, un paramètre de fonction de type tableau est le même que celui d'un type de pointeur, de sorte que les éléments suivants sont les mêmes:

static int foo(int w[]); 
static int foo(int* w); 

Alors, oui, il est légal de passer NULL à cette fonction.

Étant donné que le nom d'un tableau est un pointeur sur son premier élément

Pas tout à fait. Un tableau désintègre en un pointeur vers son élément initial dans la plupart des circonstances, les exceptions étant quand il est l'opérande de sizeof ou l'opérateur unaire & (l'opérateur d'adresse).

+0

Plus correctement, il est * impossible * de déclarer un paramètre de type tableau (et illégal de déclarer une valeur de retour de type tableau). – caf

1

C99 a la construction avec la syntaxe awfull (par exemple votre)

static int foo(int w[static MAX_COUNT]); 

qui signifie essentiellement que la fonction attend au moins MAX_COUNT éléments. Appeler une telle fonction avec NULL serait alors considéré comme comme une erreur.

Malheureusement, cette fonctionnalité n'est pas encore largement implémentée. Par exemple gcc et clang acceptez simplement la syntaxe, mais ne faites rien d'utile avec les informations .

Questions connexes