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
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,
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 !)
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 )