Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

577
Vistas
memcpy unsigned int a error de segmentación de caracteres sin firmar

Me gustaría copiar 4 bytes de un int sin firmar a una matriz de caracteres sin firmar. Una vez ejecutada, la siguiente función get_result va a la falla de segmentación:

 int exec_cmd(unsigned int * apu32Var) { int ret = -1; char cmd[100] = { 0 }; char resp[100] = { 0 }; sprintf(cmd, "%s %s", "/home/send_frames.sh", "read"); ret = exec_cmd_ret_result(cmd, resp); if( apu32Var != NULL ) { *apu32Var = (((unsigned int)resp[0]) <<24)+(((unsigned int)resp[1]) <<16)+(((unsigned int)resp[2]) <<8)+(unsigned int)resp[3]; } return ret; } int get_result(unsigned char * buffer, unsigned short * size) { unsigned int u32Var = 0; exec_cmd(&u32Var); memcpy(buffer, &u32Var, sizeof(unsigned int)); *size += sizeof(unsigned int); return 0; } int main(int argc, char **argv) { unsigned char *buf; unsigned short *size; get_result(buf+4, size); return 0; }

Sin embargo, con respecto a la página de manual de memcpy(), parece que memcpy() está bien administrado. ¿Qué está yendo mal?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Suponiendo que su llamada a test_result en realidad debería llamar a get_result , entonces tiene dos grandes problemas.

La primera y más grave es que pasa variables locales no inicializadas como argumentos a la función. Las variables locales no inicializadas tienen valores indeterminados . Para un puntero, significa que puede apuntar a casi cualquier lugar, y tratar de desreferenciarlo conducirá a un comportamiento indefinido . Debe hacer que estos punteros apunten a algún lugar válido para que funcione. Esto va para ambas variables.

El segundo problema es que no comprende cómo funciona la emulación de paso por referencia en C. Sí, la función debe tomar un puntero, pero en realidad no debe crear una variable de puntero y pasar a la función. En su lugar, debe usar el operador de dirección & en una variable que no sea de puntero.

Para resolver ambos problemas, su código debería verse algo como

 unsigned char buf[256] = { 0 }; // Arbitrary size, all initialized to zero unsigned short size = 0; // To make sure it's properly initialized get_result(buf + 4, &size); // Note use of & to pass a pointer to the variable size

Tenga en cuenta que funciona con una matriz, ya que las matrices se descomponen naturalmente en punteros a su primer elemento.

over 4 years ago · Santiago Trujillo Denunciar

0

buf en main nunca se inicializa, por lo que apunta a una ubicación aleatoria en la memoria. Este es un comportamiento indefinido y una receta perfecta para una falla de segmento.

De manera similar, *size se lee cuando usa += , pero el valor nunca se inicializó en main , por lo que su desreferencia es un valor indefinido.

Debe declarar buf como una matriz de tamaño suficiente y pasarla. Además, declare size como un int , inicialícelo en 0 y pase su dirección:

 int main(int argc, char **argv) { unsigned char buf[100]; unsigned short size = 0; // I'm assuming this was a typo and you ment to call get_result instead of test_result get_result(buf, &size); return 0; }
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda