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);