Octet nul et tableaux en C

Si je déclare un tableau de caractères de dire 10 caractères comme suit …

char letters[10]; 

est-ce que je crée un ensemble d’emplacements de mémoire représentés par des caractères d’indice 0 à 9, alors le 10ème index est l’octet nul?

si c’est le cas, cela signifie que je crée vraiment 11 emplacements en mémoire pour le tableau (0 à 10), le dernier élément étant l’octet nul ou ai-je 10 emplacements en mémoire (0 à 9), puis C ajoute l’octet nul à une nouvelle position (le tableau a donc 1 octet de plus que ce que j’ai déclaré)?

Merci

On dirait que vous êtes confondu avec les tableaux et les chaînes.
Quand vous déclarez

 char letters[10] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; 

alors il ne réserve que 10 octets contigus dans un emplacement de mémoire.

  2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 //memory addresses. I assumed it is to be starting from 2000 for simplification. +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ | | | | | | | | | | | | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | | | | | | | | | | | | +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ 

En C, l’indexation commence à 0 . Vous pouvez accéder à l’emplacement de mémoire alloué, des letters[0] aux letters[9] . L’access aux letters[10] emplacement letters[10] invoquera un comportement indéfini . Mais quand vous déclarez comme ça

 char *letters = "0123456789"; 

ou

 char letters[11] = "0123456789"; 

alors il y a 11 octets d’espace alloués en mémoire; 10 pour 0123456789 et un pour \0 (caractère NUL).

  2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 //memory addresses. I assumed it is to be starting from 2000 for simplification. +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-------+ | | | | | | | | | | | | | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '\0' | | | | | | | | | | | | | +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-------+ ^ | NUL character 

Prenons un autre exemple

 #include  int main(){ char arr[11]; scanf("%s", arr); printf("%s", arr); return 0; } 

Consortingbution:

 asdf 

Sortie:

 asdf 

Maintenant, regardez l’emplacement de la mémoire

  +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-------+ | | | | | | | | | | | | | 'a' | 's' | 'd' | 'f' |'\0' | | | | | | | | | | | | | | | | | | | +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-------+ 

est-ce que je crée un ensemble d’emplacements de mémoire représentés par des caractères d’index 0-9

Oui

alors le 10ème index est l’octet nul?

Non.

Vous avez réservé un espace pour exactement 10 caractères. Rien d’autre. Rien ne mettra automatiquement le dernier octet à zéro ou agira comme s’il l’était. Il n’y a pas de 11ème caractère pouvant contenir un zéro, vous n’en avez que 10.

Si vous voulez utiliser cela avec des fonctions de chaîne, il est de votre devoir en tant que programmeur de vous assurer que votre chaîne est terminée par zéro. (Et ici, cela signifie qu’il peut contenir au plus 9 caractères significatifs.)

Quelques exemples courants d’initialisation:

 // 10 chars exactly, not initialized - you have to take care of everything char arr1[10]; // 10 chars exactly, all initialized - last 7 to zero - ok "C ssortingng" char arr2[10] = { 'a', 'b', 'c' }; // three chars exactly, initialized to a, b and c - not a "C ssortingng" char arr3[] = { 'a', 'b', 'c' }; // four chars exactly, initizalized to a, b, c and zero - ok "C ssortingng" char arr4[] = "abc"; 

Et tout au long de votre programmation en [Turbo (C ++), essayez d’utiliser F7, ou F8 et Alt + F4, vous pouvez voir ce qui se passe à l’intérieur qui sera très utile pour un débutant qui a des doutes comme celui-ci.

Chaque fois que vous déclarez une variable, un emplacement de mémoire distinct sera atsortingbué à cette variable. En cas de variable tableau comme

 char letters[10]; 

Dix espaces mémoire seront alloués à des lettres variables.

Et la taille de la mémoire allouée variera selon le type de données (c.-à-d. Int, char, float …).

Toujours dans votre cas: si vous souhaitez stocker un nom tel que “csstudent” dans un tableau, vous devez déclarer une taille de tableau de “dix”, et même “la taille de csstudent” est “neuf”, car le dernier index doit stocker le caractère “\ 0”. indique la fin de la chaîne

// 1000,1001 l’espace mémoire est alloué, peut varier dans votre système

  1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 +-----+-----+-----+-----+-----+-----+-----+-----+-----+------+ | | | | | | | | | | | | 'c' | 's' | 's' | 't' | 'u' | 'd' | 'e' | 'n' | 't' | '\0' | | | | | | | | | | | | +-----+-----+-----+-----+-----+-----+-----+-----+-----+------+