2010-06-01 8 views

Respuesta

6

el puntero TCHAR están llegando desde el exterior, y mi lado tiene ni idea de lo grande que la memoria intermedia planteada por el puntero es

Si esto es así, entonces ninguno de ellos hace lo que quiere.

La manera en que funcionan todas las funciones "seguras" es que les diga cuán grande es el búfer de destino.

¿No sabe? No puedes usar esas funciones.

int buffer_size = _tcslen(xxx) * sizeof(TCHAR) 

Este no funcionará. Todo lo que garantizará es que la cadena copiada no es más larga que lo que ya está en el búfer. Si el buffer no se ha inicializado, fallará; si el buffer comienza con un '\0', no se copiará nada; Etcétera.

7

Suponiendo que está utilizando _tcscpy_s y no _tcscpy, el segundo parámetro debe ser el tamaño real de la matriz, y no la longitud de la cadena actualmente contenida. Por ejemplo:

TCHAR dest[20]; 
_tcscpy_s(dest, _countof(dest), _T("Hello")); 

incluso se puede utilizar la versión de 2 parámetros que no requerirá el parámetro de tamaño:

_tcscpy_s(dest, _T("Hello")); 

Si tchar_pointer es en realidad un puntero y no una matriz (como lo implica su nombre) debe tener mucho cuidado al determinar cuál es su capacidad real. Se necesitaría más contexto para sugerir el enfoque correcto, pero usar la longitud de la cadena contenida para calcular el tamaño del búfer es casi seguro un enfoque equivocado.

+0

La sugerencia anterior 2 no funcionará, ya que el puntero tchar viene de externo, y mi lado no tiene idea de cuán grande es el búfer al que hace referencia el puntero. –

+3

Entonces no puede usar las funciones seguras '_s', porque el objetivo de ellas es que proporcione el tamaño del búfer. –

2

Si tchar_pointer es un puntero (a diferencia de una matriz) se supone que debe saber qué tan grande es el búfer apuntado. Si no lo sabe, no puede averiguarlo desde el puntero sin procesar, strcpy_s no ayuda allí.

3

La respuesta de bara es muy importante para usted, porque la respuesta correcta difiere de todas las ideas que enumeró. Pero bara no te explicó la diferencia entre _tcslen y _tcsclen, así que lo haré.

En una compilación Unicode, _tcslen y _tcsclen contarán el número de TCHAR en el valor actual de la cadena. Cada TCHAR es uno wchar_t.

En una compilación de Multibyte, _tcslen contará el número de TCHAR en el valor actual de la cadena. Cada TCHAR es un char. Pero _tcsclen contará el número de caracteres multibyte en el valor actual de la cadena. Cada carácter multibyte es uno o más TCHAR, cada carácter multibyte tiene uno o más caracteres. Los diferentes caracteres multibyte pueden tener diferentes longitudes, según la página de códigos y los caracteres individuales.

+0

Entonces, ¿puedo usar int buffer_size = _tcslen (xxx) * sizeof (TCHAR) para los 2dos parámetros para entornos unicode y multibyte? –

+2

No, pero puede usar int current_occupied_size = _tcslen (xxx) * sizeof (TCHAR) para los 2dos parámetros para entornos tanto unicode como multibyte. Si el tamaño del búfer es mayor que el tamaño ocupado actualmente, está perdiendo espacio que no puede medir. Si el tamaño del búfer es menor que el tamaño ocupado actualmente, entonces tiene un desbordamiento de búfer y está ayudando a propagar virus. Será mejor que averigüe cuál es realmente el tamaño del búfer. –

Cuestiones relacionadas