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?
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 sizeTenga en cuenta que funciona con una matriz, ya que las matrices se descomponen naturalmente en punteros a su primer elemento.
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; }