2016-01-11 6 views
0

Pourquoi est-ce que les éléments suivants:argc/argv affecte l'octet nul dans les tableaux?

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    char array[3] = {'1', '2', '3'}; 
    printf("%s\n", array); 

    return 0; 
} 

produit 1238À§Wˇ ("123" + quelques caractères aléatoires) comme prévu, alors que le même code avec:

int main(void)

au lieu de argc, argv produit: 123 (bien qu'il n'y ait pas de place pour l'octet nul).

Comment est-il que le manque de place pour un octet nul dans array avec void ne semble pas avoir d'importance?

+9

Un comportement non défini peut différer d'un autre :). BTW, est-ce que 'array array [3] = {'1', '2', '3', '4'};' vraiment compile? – AlexD

+0

Voulez-vous dire 'char array [3] = {'1', '2', '3'};'? Vous n'avez même pas alloué assez d'espace pour le ''4' '. C'est une violation de contrainte; un compilateur pourrait juste le traiter comme une erreur fatale. (gcc, malheureusement, ne le signale que par défaut.) –

+0

Qu'avez-vous passé pour les arguments de la ligne de commande? – stackptr

Répondre

2

Lorsque vous faites ceci:

char array[3] = {'1', '2', '3'}; 
printf("%s\n", array); 

vous invoquez un comportement non défini, parce que le tableau de caractères n'est pas mis fin à NUL. Vous pourriez avoir "123", ou rien du tout, ou quelque chose comme ça, ou cela pourrait varier en fonction de conditions arbitraires.

Dans votre cas spécifique, juste une supposition éclairée, après la variable locale array c'est probablement la mémoire pour les arguments de la fonction, et ceux qui se trouvent être argc et argv. Selon les arguments réels à main et même les valeurs d'exécution passées au programme, les octets sur ces positions de mémoire varieront. Et parfois, ils devront avoir un octet NUL au bon endroit et affecter la sortie de votre programme.

De toute façon, mon conseil est de ne pas trop penser aux cas d'UB. Ils sont mieux pensés comme juste undefined.

3

Vous ne fournissez pas l'octet nul de fin de chaîne (EOS), donc printf continue à avancer jusqu'à ce qu'il [trouve juste] pour en trouver un (c'est-à-dire les caractères parasites).

Tous les éléments suivants travailleraient:

char array[4] = { '1', '2', '3', '\0' }; 
char array[4] = { '1', '2', '3' }; 
char array[4] = "123"; 
char array[] = { '1', '2', '3', '\0' }; 
char array[] = "123"; 
char *array = "123";