Je pensais avoir compris la réponse à this question mais pas moi. Je comprends le premier résultat mais je ne sais toujours pas comment faire correctement la copie. J'ai essayé le code suivant:Copier une chaîne dans un tableau malloc'd de chaînes
// TstStrArr.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <string.h>
#include <malloc.h>
int main()
{
char ** StrPtrArr;
char InpBuf0[] = "TstFld0";
char InpBuf1[] = "TstFld1";
StrPtrArr = (char **)malloc(2 * sizeof(char *));
StrPtrArr[0] = (char *)malloc(10 + 1);
printf("inpbuf=%s sizeof=%2d ", InpBuf0, sizeof(StrPtrArr[0]));
strncpy_s(StrPtrArr[0], sizeof(StrPtrArr[0]), InpBuf0, _TRUNCATE);
printf("strptrarr=%s\n", StrPtrArr[0]);
StrPtrArr[1] = (char *)malloc(10 + 1);
printf("inpbuf=%s sizeof=%2d ", InpBuf1, sizeof(*StrPtrArr[1]));
strncpy_s(*StrPtrArr[1], sizeof(*StrPtrArr[1]), InpBuf1, _TRUNCATE); // error here
printf("*strptrarr=%s\n", StrPtrArr[1]);
free(StrPtrArr[0]);
free(StrPtrArr[1]);
free(StrPtrArr);
return 0;
}
Le résultat je suis arrivé était:
inpbuf=TstFld0 sizeof= 4 strptrarr=Tst
inpbuf=TstFld1 sizeof= 1
et l'erreur suivante:
Exception thrown: write access violation.
destination_it was 0xFFFFFFCD.
Le résultat que je pensais que je me faisais était l'une des suivant:
inpbuf=TstFld1 sizeof=11 *strptrarr=TstFld1
inpbuf=TstFld1 sizeof= 1 *strptrarr=T
Je comprends le La première copie a copié le tampon d'entrée sur le pointeur de 4 octets qui était incorrect. Je pensais que la deuxième copie copierait le tampon d'entrée à la valeur du pointeur déréférencé d'une taille de 11 mais ce n'était pas le cas. Je devine que la copie était au premier caractère de la chaîne dans le tableau. Je ne comprends pas assez la mémoire pour connaître la signification de l'adresse 0xFFFFFFCD mais je suppose que c'est en mémoire morte causant ainsi l'erreur.
Quelle est la bonne façon de faire la copie?
(je ne pense pas que cela importe, mais je suis en utilisant VS 2015 Community Edition Update 3.)
sizeof ne vous donner une longueur de chaîne. – koper89
Merci.C'est vrai. Je crois que la deuxième version de MS de 'strncpy' doit être la taille de la variable de récepteur. –
Qu'est-ce que '_TRUNCATE'? Il ne semble pas que vous utilisiez 'strncpy_s' correctement. Voir la [spécification] (http://port70.net/~nsz/c/c11/n1570.html#K.3.7.1.4) – Olaf