extern void f(const char *str, char *dest);
ou préférez vous comme prototype :
extern void f(const char str[], char dest[]);
et pourquoi ? (C'est 100% équivalent)
Même question sur autre chose que des tableaux de char .
extern void f(const char *str, char *dest);
extern void f(const char str[], char dest[]);

Pen^2 (./3) :Ça par contre, c'est pas bien, à moins que tu puisses jurer que jamais, jamais tu ne déclareras plus d'une seule variable en une fois
const char* s.

Zerosquare (./4) :Je le jure !
Ça par contre, c'est pas bien, à moins que tu puisses jurer que jamais, jamais tu ne déclareras plus d'une seule variable en une fois


Uther (./7) :
C est un langage sale qui mélange complètement les notions de pointeur et tableaux

PpHd (./1) :
extern void f(const char *str, char *dest);
const int *f(int, const int [], const int *);
void f(const char str[]) {
printf("Size=%d\n", (int) sizeof(str));
} void f(const char str[1024]) {
printf("Size=%d\n", (int) sizeof(str));
}PpHd (./10) :
car le prototype de la fonction explicite le fait qu'il attend un tableau et non pas juste un caractère
d'autant que ça "tendrait à indiquer", mais rien ne certifie que const int [] n'attend pas au final qu'un caractère, donc bon, c'est le genre de "sécurité" étonnante, à moins qu'on fasse une confiance aveugle au code des autres
)Folco (./11) :
c'est une pure vue de l'esprit cette vision des choses

d'autant que ça "tendrait à indiquer", mais rien ne certifie que const int [] n'attend pas au final qu'un caractère,
), pour trouver ça avantageux, parce que pour le moment ça me parle pas trop cette distinction très formelle.int n = ....; int (*p)[n] = calloc (n, sizeof(int)); for(int i = 0; i < n; i++) (*p)[i] = i;
int n = ....; int *p = calloc (n, sizeof(int)); for(int i = 0; i < n; i++) p[i] = i;
char *str = "toto"; char str[] = "toto";
void f(const int tab[])
void f(const int n[3][3]) { ...}
int x[3][3]; )PpHd (./10) :Alors ça c'est effectivement sacrément vicieux, je ne m'en souvenais plus...
Encore plus troublant:
void f(const char str[1024]) {
printf("Size=%d\n", (int) sizeof(str));
}
affiche encore Size=8 ! (cf. http://c-faq.com/aryptr/aryparmsize.html )
Folco (./14) :
pourquoi, puisqu'un tableau et un pointeur sont la même chose

PpHd (./15) :
En fait, c'est que l'arithmétique de pointeurs et l'indexage de tableau sont la même chose: a[b] = *(a+b) (et c'est la norme C qui l'impose !)

) pour l'expression tableau-offset. Et on n'a pas pu dire que c'était un bug de compilo, parce que ce n'est pas défini par l'ISO C. Mon collègue en a eu la confirmation sur le newsgroup comp.lang.c 





squalyl (./16) :
oui mais si a est déclaré comme tableau, ça marche SEULEMENT pour des nombres positifs! Enfin presque, je m'explique:
avec les déclarations:
int a[]
int *b=a;
int offset;
a+1 est défini, et donne le même code asm que b+1
MAIS
a-1 est TOTALEMENT indéfini et le compilateur peut générer ce qu'il veut, de nop à reboot en passant par system("format c: /y")
alors que b-1 fonctionne
a noter que dans tous les cas, a+offset et a-offset ne pose pas de problème et fonctionne comme b+offset et b-offset, car le compilo ne peut rien optimiser!
On a rencontré un compilateur embarqué qui générait de la merde (non destructive, mais non fonctionnelle) pour l'expression tableau-offset. Et on n'a pas pu dire que c'était un bug de compilo, parce que ce n'est pas défini par l'ISO C. Mon collègue en a eu la confirmation sur le newsgroup comp.lang.c
c'est la seule différence que je connaisse entre tableau et pointeur
The definition of the subscript operator [] is that E1[E2] is identical to (*((E1)+(E2))).
If both the pointer operand and the result point to elements of the same array object, or one past the last element of the array object, the evaluation shall not produce an overflow; otherwise, the behavior is undefined.
Folco (./19) :
Non mais quand on code proprement, on écrit des trucs pareils ?



PpHd (./10) :
Encore plus troublant:void f(const char str[1024]) { printf("Size=%d\n", (int) sizeof(str)); }
affiche encore Size=8 ! (cf. http://c-faq.com/aryptr/aryparmsize.html )