Initialisation du pointeur de caractères en C

Je ne suis pas si clair sur le pointeur de caractère et comment ils fonctionnent.

Le programme construit, mais se bloque lorsque je l’exécute.

char *ab = NULL; //ab = "abc123"; // works fine sprintf(ab, "abc%d", 123); // this line seems to crash the program 

Je ne comprends pas comment cela peut être faux, lorsque sprintf prend un premier argument (char * str).

Quelqu’un peut-il m’expliquer s’il vous plaît?

Vous n’avez alloué aucune mémoire à utiliser avec ab .

La première affectation fonctionne parce que vous atsortingbuez à ab une constante de chaîne: "abc123" . La mémoire pour les chaînes constantes est fournie par le compilateur en votre nom: vous n’avez pas besoin d’allouer cette mémoire.

Avant de pouvoir utiliser ab avec, par exemple, sprintf , vous devez allouer de la mémoire à l’aide de malloc , puis atsortingbuez cet espace à ab :

 ab = malloc(sizeof(char) * (NUM_CHARS + 1)); 

Ensuite, votre sprintf fonctionnera aussi longtemps que vous avez créé suffisamment d’espace avec malloc . Remarque: le + 1 correspond au terminateur nul .

Alternativement, vous pouvez créer de la mémoire pour ab en le déclarant comme un tableau:

 char ab[NUM_CHARS + 1]; 

Sans allouer la mémoire d’une manière ou d’une autre pour ab , l’appel de sprintf essaiera d’écrire dans NULL , ce qui constitue un comportement indéfini. c’est la cause de votre crash.

Vous devez allouer de la mémoire pour vos données. En effet, sprintf prend char* , mais il n’alloue pas de mémoire pour vous.

La première ligne fonctionne bien car le compilateur alloue automatiquement des données pour les tables constantes de caractères définies lors de la compilation.

Contrairement à Java ou à d’autres langages de niveau supérieur, de nombreuses fonctions de chaîne de la bibliothèque C ne définissent pas simplement une référence de chaîne, mais fonctionnent sur un bloc de mémoire préalloué appelé tableau de caractères.

Votre première ligne dit que ab pointe sur un emplacement mémoire inexistant.

Vous auriez plus de chance si, au lieu de char *ab = NULL; vous avez soit:

 char ab[12]; 

ou:

 char *ab = (char*)malloc(12); 

Tu peux le faire

 char ab[10]; //allocate memory sprintf(ab, "abc%d", 123); 

“ab” est nul et sprintf essaie d’y écrire, vous devez d’abord l’affecter.

 char ab[20]; sprintf(ab, "abc%d", 123); // 

ou

 char * ab = malloc(20); // new, whatever sprintf(ab, "abc%d", 123); // 

Il y a plusieurs choses à penser ici. Votre exemple original est ci-dessous:

 char *ab = NULL; //ab = "abc123"; // works fine sprintf(ab, "abc%d", 123); // this line seems to crash the program 

char *ab = NULL; est un pointeur sur un caractère et est initialisé à NULL;

Je ne pense pas ab = "abc123"; a bien fonctionné à moins que cela ne ressemble à char *ab = "abc123"; . En effet, vous avez initialisé char *ab à une chaîne en lecture seule. L’initialisation a probablement eu lieu au moment de la compilation.

Votre sprintf(ab, "abc%d", 123); La ligne a échoué car vous n’avez initialisé aucune mémoire pour le pointeur char *ab avance. En d’autres termes, vous n’avez pas fait quelque chose comme:

 ab = malloc((sizeof(char) * 3) + 1); /* + 1 allows for null ssortingng terminator. */ 

Vous pouvez résoudre votre problème de deux manières. Allouez la mémoire dynamic comme indiqué ci-dessus ou faites en sorte que la chaîne soit un tableau de longueur fixe, comme char ab[25] = {0}; . Généralement, je crée un tableau d’une longueur de 1024, 256 ou un nombre qui couvrira généralement la plupart des cas de longueur de chaîne. Ensuite, j’utilise des pointeurs de caractères pour les fonctions qui opèrent sur le tableau.