2011-09-21 2 views
0

j'ai quelques doutes en ce qui concerne les pointeurs de caractère:pointeurs de caractères (attribués par les nouvelles) et leur initialistaion

1.Lorsque nous écrivons la déclaration:

char *t; 

devons-nous faire

t=new char[6]; 
strcpy(t,"terry"); 

ou directement

t="terry"; 

fera ..

2.Also si nous suivons faire

char *t; 
t=new char[6]; 
t="terry"; 

va t maintenant pointer vers la mémoire allouée de tas ou la première lettre du tissu éponge (si l'on regarde du point de vue de la manipulation des pointeurs).

3.if i écrire:

char *t; 

puis je dois initialiser 't' à '\ 0' (mais t doit pointer vers un espace mémoire alloué) .. comment faire, je parce que mon compilateur mvc 2010 ne permet pas ...

t=new char[5](0);//0 is the ascii value of '\0' 
+1

N'utilisez pas 'char *', utilisez 'std :: string 'à la place (' std :: vector 'si vous vous sentez vraiment rebelle). –

+0

Pourquoi écrivez-vous du code comme ça en C++? –

+0

BTW lol à '// 0 est la valeur ascii de '\ 0'' :) –

Répondre

3

Vous êtes étiqueté C++. Utilisez la chaîne:

std::string t("terry"); et laissez la langue prendre soin des détails pour vous.

  1. De toute façon, cela dépendra de vos besoins. Si vous avez besoin de changer la chaîne plus tard, vous devez allouer de la mémoire, et lorsque vous allouez toujours n'oubliez pas de le supprimer plus tard.

  2. La première lettre du littéral.

  3. t=new char[5]; t[0] = 0;

1
  1. Vous pouvez faire cette dernière option, mais le pointeur point le plus probablement à une lecture seule région de mémoire, de sorte que vous ne devriez le faire avec un const char *.
  2. Dans ce cas, t indiquera finalement une zone de mémoire en lecture seule, qui fuit ces 6 octets.
  3. Vous pouvez utiliser la fonction memset() pour définir un tableau entier à 0.

Mais oui, utilisez std::string à la place et arrêter de penser à cela.

1
  1. Vous shoudn't faire le second, parce que t est char*, et ainsi t="terry" est dépréciée (et votre compilateur peut donner cet avertissement indiquant l'instruction d'affectation.)

  2. La mémoire allouée est une fuite, puisque vous ne l'avez pas utilisé, et t points à terry.Encore une fois, ceci est obsolète (et votre compilateur pourrait donner cet avertissement indiquant l'instruction d'assignation).

  3. Just do: t = new char[5](); Il est initialisé par défaut maintenant.

Comme la meilleure pratique, en général, est std::string. Donc, utilisez-le:

std::string t = "terry"; 

Aucune fuite de mémoire, aucune fonction obsolète, aucun avertissement. Pas de tension.

+0

@ nawaz ... j'ai essayé ceci ... ça ne marche pas .... erreur dit pour l'initialisation de tableau accolades sont nécessaires, mais même si je fais {'\ 0'} une autre erreur surgit disant manque ' " avant {et} .. – avinash

+0

@avinash: Ohh .. j'avais tort. C'est en fait 't = new char [5]();'. – Nawaz

+0

@nawaz ... mais c'est simplement une escapade pour le cas '\ 0' ... et si je voulais l'initialiser à 'n' à tous les endroits. – avinash

1

1. Si la chaîne (par exemple « éponge ») ne va pas se changer partout en vous programme, vous pouvez certainement faire

char* t = "terry"; 

et oublier la mémoire allouée à la chaîne comme sera libéré par lui-même. Cependant, une meilleure pratique de programmation pour les constantes chaînes serait déclarerait t que const char* comme ceci:

const char* t = "terry"; 

Mais si elle va se changer, alors il est soit

char* t = new char[6]; 
strcpy(t, "terry"); 

ou

char t[6]; 
strcpy(t, "terry"); 

Dans le premier cas, où new opérateur est utilisé, vous devrez libérer la mémoire allouée avec new après que vous ne plus besoin de la chaîne:

delete[] t; 

Dans le second cas, la mémoire sous-jacente la piqûre sera libérée automatiquement lorsque t quitte le champ C de (des accolades), il a été déclaré dans (mais si t est membre d'un objet , la mémoire ne sera libérée que lorsque l'objet sera détruit).

2. Après

char* t; 
t = new char[6]; 
t = "terry"; 

t serait vraiment pointer « éponge », mais le pointeur/adresse vous devez libérer la mémoire allouée à new est perdu pour de bon.

3. Les terminateurs de chaîne vides ('\ 0') sont comme les autres caractères: ils doivent résider quelque part dans la mémoire. Vous avez été assez sage pour allouer 6 octets pour « éponge », qui est de 5 caractères de longueur: après

char* t = new char[6]; 
strcpy(t, "terry"); 

le sixième octet du bloc de mémoire pointé par t maintient la terminaison nulle. Mais

char* t; 

n'alloue pas de mémoire en dehors du pointeur t. Donc, si vous voulez qu'une chaîne ne contienne qu'une terminaison nulle (être de longueur nulle), vous pouvez le faire de cette façon:

char* t = new char[1]; 
t[0] = '\0'; 
+0

@desmond ... mais nous écrivons int * y = new int (7) ..... pour initialiser l'adresse pointée par y ... nous ne pouvons pas le faire dans le cas d'un tableau – avinash

+0

Oui, si ce n'est pas le cas le 'char * t =" terry "' façon, vous pouvez combiner l'allocation de mémoire avec son initialisation dans une instruction C++ si vous utilisez la mémoire de la pile (le 'char t [6]] chemin et non dynamiquement allouée avec la' nouvel opérateur. Supposons que vous ayez besoin d'un tableau de 4 caractères tous nulls ('\ 0'), alors vous écrivez: 'char t [4] = {'\ 0', '\ 0', '\ 0', '\ 0'} " –

Questions connexes