C/Pointeurs

Un article de Le wiki de 2 noisettes - noisette.ch.

(Redirigé depuis Pointeurs)


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