2011-02-02 16 views
12

¿Cuál es la forma correcta de inicializar unsigned char*? Actualmente estoy haciendo esto:Forma correcta de inicializar Car sin firmar *

unsigned char* tempBuffer; 
tempBuffer = ""; 

O debo utilizar memset(tempBuffer, 0, sizeof(tempBuffer));?

+2

El nombre de la variable es incorrecto. No es un buffer, solo un puntero. Crear un buffer con char sin signo tempBuffer [666]; –

Respuesta

8

El segundo método le dejará con un puntero nulo. Tenga en cuenta que no está declarando ningún espacio para un búfer aquí, está declarando un puntero en un búfer que debe crearse en otro lugar. Si lo inicializa en "", el puntero apunta a un búfer estático con exactamente un byte — el terminador nulo. Si desea un búfer puede escribir caracteres en el futuro, utilice la sugerencia de matriz de Fred o algo así como malloc.

+0

por lo que 'malloc (24);' (o algún número) sería preferible a la configuración de '" "' o '0' o' NULL', en su opinión? – Brian

+0

@Brian: dudo que alguien pueda responder sin saber lo que quiere lograr. Sin embargo, parece que de hecho necesitas asignar algo de memoria. En este caso, nunca olvides 'free()' cuando ya no lo necesites. – ereOn

+0

@Brian: Generalmente uno usa 'malloc' cuando se desconoce el tamaño máximo que necesitará en el momento de la compilación, por lo que lo establecerá en' NULL' al principio, luego 'malloc' tanto como lo necesite cuando sepa el tamaño. La asignación de una matriz es preferible cuando el tamaño es relativamente pequeño y fijo, ya que no tiene que preocuparse por liberar la memoria, pero causa problemas si intenta devolverla de su función. Como dijo @ereOn, realmente necesitamos más detalles sobre lo que estás tratando de hacer si quieres recibir consejos precisos. –

2

Depende de lo que desee lograr (por ejemplo, si alguna vez desea modificar la cadena). Ver p. http://c-faq.com/charstring/index.html para más detalles.

Tenga en cuenta que si se declara un puntero a una cadena literal, debe ser const, es decir:

const unsigned char *tempBuffer = ""; 
+0

Si lo hago 'const', no puedo agregarlo más tarde ... ¿Siempre debería ser' const'? – Brian

+1

@Brian: si apunta a una cadena literal, debería ser const. –

+1

@Brian: si tiene la intención de "agregar más tarde", debe señalar su 'tempBuffer' a un búfer de memoria en realidad, y no a una cadena literal. – KevenK

5

Como es un puntero, o bien desea inicializar a NULL primero como esto:

unsigned char* tempBuffer = NULL; 
unsigned char* tempBuffer = 0; 

o asignar una dirección de una variable, así:

unsigned char c = 'c'; 

unsigned char* tempBuffer = &c; 

EDIT: Si desea asignar una cadena, esto se puede hacer de la siguiente manera:

unsigned char myString [] = "This is my string"; 
unsigned char* tmpBuffer = &myString[0]; 
+2

Vale la pena aclarar que su segundo ejemplo le dará un puntero válido a un carácter válido, pero no se puede usar con funciones de cadena estándar (aunque el tipo es el mismo) ya que las funciones de cadena esperan un puntero a una matriz terminada en nulo de personajes, y no un puntero a un solo personaje. Creo que el OP está interesado en trabajar con cadenas. –

+0

Gracias Tim. Editado en consecuencia. –

1

Si el plan es que sea un búfer y desea moverlo más tarde para señalar algo, inícielo a NULL hasta que realmente apunte a un lugar al que desea escribir, no una cadena vacía.

unsigned char * tempBuffer = NULL; 
std::vector< unsigned char > realBuffer(1024); 
tempBuffer = &realBuffer[0]; // now it really points to writable memory 
memcpy(tempBuffer, someStuff, someSizeThatFits); 
1

La respuesta depende de lo que inted para utilizar el signo sin signo para. Un char es nada nada más que un pequeño entero, que es de tamaño 8 bits en el 99% de todas las implementaciones.

C pasa a tener un soporte de cadena que se adapta bien con char, pero eso no limita el uso de char a cadenas.


La forma correcta de inicializar un puntero depende de 1) su alcance y 2) su uso previsto.

Si el puntero se declara estático y/o se declara en el alcance del archivo, entonces ISO C/C++ garantiza que se inicializa a NULL. Los puristas del estilo de programación aún lo establecerían en NULL para mantener su estilo coherente con las variables de ámbito local, pero teóricamente no tiene sentido hacerlo.

En cuanto a qué inicializarlo ... establézcalo en NULL. No lo configure para que apunte a "", porque eso asignará un byte ficticio estático que contiene una terminación nula, que se convertirá en una pequeña pérdida de memoria estática tan pronto como el puntero se asigne a otra cosa.

Uno puede preguntarse por qué tiene que inicializarlo para nada en primer lugar. Simplemente configúralo en algo válido antes de usarlo. Si te preocupa utilizar un puntero antes de darle un valor válido, deberías obtener un analizador estático adecuado para encontrar errores tan simples. Incluso la mayoría de los compiladores detectarán ese error y le darán una advertencia.

13

Para "adecuadamente" inicializar un puntero (unsigned char * como en el ejemplo), lo que necesita hacer un simple

unsigned char *tempBuffer = NULL; 

Si desea inicializar una matriz de unsigned char s, puede realizar cualquiera de seguir cosas:

unsigned char *tempBuffer = new unsigned char[1024](); 
// and do not forget to delete it later 
delete[] tempBuffer; 

o

unsigned char tempBuffer[1024] = {}; 

lo haría También recomendaría a echar un vistazo a std::vector<unsigned char>, que se puede inicializar como esto:

std::vector<unsigned char> tempBuffer(1024, 0); 
+0

http://codepad.org/DdYMIY0d –

3

Si se conoce el tamaño de la memoria intermedia en tiempo de compilación:

unsigned char buffer[SIZE] = {0}; 

Para buffers asignados dinámicamente (búferes asignados durante tiempo de ejecución o en la montón):

1.Prefer la new operador:

unsigned char * buffer = 0; // Pointer to a buffer, buffer not allocated. 
buffer = new unsigned char [runtime_size]; 

soluciones 2.Many a "inicializar" o se llenan de un valor simple:

std::fill(buffer, buffer + runtime_size, 0); // Prefer to use STL 
memset(buffer, 0, runtime_size); 
for (i = 0; i < runtime_size; ++i) *buffer++ = 0; // Using a loop 

lado idioma 3.El C proporciona asignación e inicialización con una llamada.
Sin embargo, la función no llama a los constructores del objeto:

buffer = calloc(runtime_size, sizeof(unsigned char)) 

Tenga en cuenta que esto también establece todos los bits en la memoria intermedia a cero; no tienes elección en el valor inicial.

Cuestiones relacionadas