Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

582
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda