web-dev-qa-db-fra.com

Chaîne dans le paramètre de fonction

int main()
{
        char *x = "HelloWorld";
        char y[] = "HelloWorld";

        x[0] = 'Z';
        //y[0] = 'M';

        return 0;
}

Dans le programme ci-dessus, HelloWorld sera dans la section en lecture seule (i.e string table). x pointera vers cette section en lecture seule, donc essayer de modifier ces valeurs aura un comportement indéfini.

Mais y sera alloué en pile et HelloWorld sera copié dans cette mémoire. donc modifier y fonctionnera bien. Littéraux de chaîne: pointeur ou tableau de caractères

Voici ma question: 

Dans le programme suivant, char *arr et char arr[] provoquent tous deux une erreur de segmentation si le contenu est modifié. 

void function(char arr[])
//void function(char *arr)
{
   arr[0] = 'X';
}        
int main()
{
   function("MyString");    
   return 0;
}
  1. Comment cela diffère-t-il dans le contexte du paramètre de la fonction?
  2. Aucune mémoire ne sera allouée pour les paramètres de fonction ?? 

S'il vous plaît partager vos connaissances.

9
Jeyaram

Dans la liste des paramètres de la fonction, char arr[] est absolument équivalent à char *arr. La paire de définitions et la paire de déclarations sont donc équivalentes.

void function(char arr[]) { ... }
void function(char *arr)  { ... }

void function(char arr[]);
void function(char *arr);

Le problème est le contexte de l'appel. Vous avez fourni un littéral chaîne à la fonction; les littéraux de chaîne ne peuvent pas être modifiés; Votre fonction a tenté de modifier le littéral de chaîne qui lui a été attribué. votre programme a invoqué un comportement indéfini et s'est écrasé. Tous complètement casher.

Traitez les littéraux de chaîne comme s'ils étaient static const char literal[] = "string literal"; et n'essayez pas de les modifier.

21
Jonathan Leffler
function("MyString");

est similaire à

char *s = "MyString";
function(s);

"MyString" est dans les deux cas un littéral de chaîne et dans les deux cas, la chaîne est non modifiable.

function("MyString");

passe l'adresse d'un littéral de chaîne à function en tant qu'argument.

6
ouah

char * arr; La déclaration ci-dessus implique que arr est un pointeur de caractère et qu'il peut pointer sur un caractère ou sur une chaîne de caractères.

& char arr []; La déclaration ci-dessus implique que arr est une chaîne de caractères et peut stocker autant de caractères que possible, voire un, mais comptera toujours sur le caractère '\ 0', ce qui en fait une chaîne (par exemple, char arr [] = "a" est similaire à char arr [] = {'a', '\ 0'})

Mais lorsqu'il est utilisé comme paramètre dans une fonction appelée, la chaîne transmise est stockée caractère par caractère dans des arguments formels, sans aucune différence.

1
Nitin Singh