2011-06-12 4 views
0

Je veux copier un caractère à une adresse vers laquelle un caractère donné * pointe.C++: écrire un caractère à un caractère donné * provoque un segfault

il est dans une fonction qui est appelée par le principal:

char data = "  "; 
myfunction(data, somethingelse); 
... 

dans la fonction que j'ai quelque chose comme

void myfunction(char* data, short somethingelse) { 
... 
char byte = 0; 
inputfilestream.read(&byte, 1); 
*data = byte; // here i get the segfault 
data++; 
... 
} 

le segfault vient aussi quand je la copie à l'aide strncpy:

strncpy(data, byte, 1); 

Pourquoi y-a-t-il une erreur de segmentation? les données ne sont pas const et l'adresse où j'écris réellement est exactement la même que celle où j'ai alloué le tableau de données. J'ai testé cela plusieurs fois.

merci d'avance.

+1

Ce code ne devrait même pas compiler: 'données char = " ";' – Nawaz

+0

CHAR =""; - vouliez-vous dire char [] data = ""; ? – kinakuta

Répondre

7

Les littéraux de chaîne sont en lecture seule. Si vous voulez une chaîne modifyable, vous devez utiliser un tableau, par exemple .:

char data[10]; 

Ou:

char *data = new char[10]; 

Pour élaborer un peu plus: le type d'une chaîne littérale est en fait const char*. Assigner un littéral de chaîne à un char* non-const est donc techniquement invalide, mais la plupart des compilateurs l'autorisent quand même pour des raisons héritées. Beaucoup de compilateurs modernes vont au moins émettre un avertissement quand vous essayez de le faire.

+0

la version supérieure fonctionne sans problème. Merci! +1 – sinned

3

data est affecté d'un littéral de chaîne. Les littéraux de chaîne sont prêts uniquement et l'écriture sur ceux-ci provoque des erreurs de segmentation.

Essayez ceci:

char data[10]; // or whatever size you want. 

à la place.

0

pourquoi existe-t-il une erreur de segmentation? les données ne sont pas const et l'adresse où j'écris réellement est exactement la même que celle où j'ai alloué le tableau de données.

Vous n'avez rien alloué. char *data = " "; ne devrait même pas compiler en C++. Vous affectez une chaîne constante à une constante.

+0

mon erreur. J'ai effectivement écrit char * data = ""; mais merci pour l'explication! – sinned

+0

Je n'arrive jamais à comprendre pourquoi les gens recopient le code - copier et coller existe depuis 30 ans - pourquoi certaines personnes ne l'utilisent pas? –

0
char byte = 0; 
inputfilestream.read(&byte, 1); 
*data = byte; // here i get the segfault 
data++; // << How many times? 

Pas de problème

#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    char *data = "Yello"; // or char data[] = "Yello"; 
    *data = 'H'; 
    puts(data); // Hello 
} 
Questions connexes