6
votes

Différence entre chaîne déclarée et chaîne allouée

I.  char *str = "Stack";

II. char *str = (char*) malloc(6);
    strcpy(str, "Stack");
What are the differences between above two approaches?Do they are same or something is different behind the curtains?
c

0 commentaires

3 Réponses :


2
votes

Dans le premier cas, votre pointeur pointe vers un const char * qui est attribué dans la seule partie de la mémoire de processus.
Dans le second cas, vous allociez la mémoire de manière dynamique et eventuall Copiez la chaîne "Stack" dans votre mémoire allouée.

Vous devez éventuellement libérer la mémoire de ii à l'aide gratuit .


3 commentaires

Et que se passera-t-il si j'essaie d'écrire dans la région de Readonly (premier cas)?


Vous ne pouvez pas, car il est const char * - une chaîne constante. Votre compilateur vous empêchera de le faire.


Et si str = "Newstring" La valeur est modifiée, pourquoi vous avez dit qu'il est const char * ?



24
votes

Le code ci-dessus provoquera des problèmes.

La première instance est appelée allocation de chaîne statique et définition. Pour les variables normales telles que int code>, etc. et des types de données non-chaînes, une telle déclaration affecterait des données sur la pile. Dans le cas des chaînes étant initialisées via des littéraux de chaîne (c'est-à-dire: "pile" code>), il est attribué dans une partie en lecture seule de la mémoire. P>

La chaîne elle-même ne doit pas être modifié, comme il sera stocké dans une partie en lecture seule de la mémoire. Le pointeur lui-même peut être changé pour pointer vers un nouvel emplacement. P>

IE: P>

Example:                       Allocation Type:     Read/Write:    Storage Location:
================================================================================
const char* str = "Stack";     Static               Read-only      Code segment
char* str = "Stack";           Static               Read-only      Code segment
char* str = malloc(...);       Dynamic              Read-write     Heap
char str[] = "Stack";          Static               Read-write     Stack
char strGlobal[10] = "Global"; Static               Read-write     Data Segment (R/W)


3 commentaires

@Valeriamaniouk et vous seriez correct. Va udpate. Merci de me le rappeler.


Les littéraux à chaîne (et la const-lit-lit) ne doivent certainement pas être stockés dans une mémoire en lecture seule (si telles existent). Les écrives, ainsi que en fonction de leur mise en commun (non), provoquent simplement un comportement indéfini. En outre, toutes les variables automatiques pourraient être sur la pile (comme éventuellement des pointeurs de classe de stockage automatique aux littéraux précédents, qui sont une classe de stockage statique).


@DEduplicator Les puces plus simples peuvent ne pas prendre en charge la mémoire RO, mais la définition des littéraux de chaîne Allez dans le segment .text . Je suis d'accord, les pointeurs eux-mêmes sont alloués automatiques (pile), mais les données qu'ils indiquent ne sont pas.



0
votes

oubliez d'autres réponses qui revendiquant quoi que ce soit sur le stockage des piles à l'intérieur, car ils sont incorrects. (OOOH maintenant ces réponses ont été supprimées ..)

cas i: vous avez un pointeur str qui pointe vers une région de mémoire lecture seule (le .rodata section) dont le contenu est "pile" .

affaire II: Vous avez un pointeur STR qui pointe vers une région allouée de manière dynamique (dans le tas) dont le contenu est "pile" , qui est modifiable et doit être libéré par Invockant gratuit (STR) après l'utilisation.


0 commentaires