C/Pointeurs
Un article de Le wiki de 2 noisettes - noisette.ch.
Sommaire |
Pointeurs et pointeurs de pointeurs
char o = 'c'; char *p = (char*)malloc(sizeof(char)); char **q = (char**)malloc(sizeof(char*));
p : adresse mémoire *p : valeur pointée &p : adresse mémoire local ...
A l'adresse mémoire pointée par &p, on trouve la valeur p, qui elle-même désigne une adresse mémoire dans laquelle se trouve la valeur *p.
A l'adresse mémoire pointée par &q, on trouve la valeur q, qui elle-même désigne une adresse mémoire dans laquelle se trouve la valeur *q, qui à sont tour désigne un adresse mémoire dans laquelle se trouve la valeur **q...
Structures
Autre aspect intéressant :
struct tuple {
char* name;
int value;
}
tuple* ptr = (tuple*)malloc(sizeof(tuple));
ptr->value = 1;
tuple var = { "tuple 1", 1 };
var.value = 2;
C'est compréhensible dans la mesure où le pointeur vers un structure donnera des lectures/écritures indirectes des valeurs. Donc la manière de manager ces valeurs sont différentes.
Tableaux dynamiques de sturucture
struct ma_struct {
char* name;
int value;
char flag;
}
ma_struct* ptr = NULL;
int counter = 0;
while (add_more_element()) {
ma_struct* new_ptr = (ma_struct*) malloc((counter + 1) * sizeof(ma_struct));
if (ptr != NULL) {
memcpy(new_ptr, ptr, counter * sizeof(ma_struct));
free(ptr); ptr = NULL;
}
ptr = new_ptr;
ma_struct* cur_ptr = &ptr[counter++];
/* et ensuite on peut utiliser cur_ptr */
char* name = (char*) malloc(MAXCHAR * sizeof(char));
sprintf(name, "objet %d", counter + 1);
cur_ptr->name = name;
cur_ptr->value = 0;
}
printf("%d éléments ajoutés\n", counter);
xtoi()
Convertir une chaine de caractère 0x12345678 en entier :
int xtoi(char* xpIn) {
int value;
sscanf(buf, "0x%x", &value);
return value;
}
Un test de format de la chaine pourrait être mérité.
Erreurs courantes
Si le système nous dit : Read error ... c'est qu'on a un problème d'allocation de zone de mémoire Donc il faut bien regarder si on ne fait pas un (i + 1 * sizeof(...)) au lieu de ((i + 1) * sizeof(...))
Taille d'un fichier
FILE* fp = fopen("file.txt", "rb");
if (fp == NULL) exit(1);
if (fseek(fp, 0, SEEK_END) == -1) exit(1);
size_t file_size;
if ((file_size = ftell(fp)) == -1) exit(1);
rewind(fp); // don't forget me !
char* fileBuffer = (char*) malloc(file_size * sizeof(char));
if (fileBuffer == NULL) exit(1);
int bytes_read = fread(fileBuffer, sizeof(char), file_size, fp);
if (ferror(fp)) {
char* error = NULL;
perror(&error);
printf("Error : %s\n", error);
fclose(fp);
exit(1);
}
if (feof(fp)) fclose(fp);
