passing structs to functions as void pointers

c, memory, struct

Solution

You're passing a pointer to a local variable to your thread - by the time the thread accesses it, the memory has been reused for something else.

Try this:

void cmd_test(int sock, char *from_p, char **arg_p, int arg_count)
{ 
    if(thread_check(1))
    {
        send_line(sock, "%s :test thread already running", from_p);
        return;
    }

    // === begin modified code in cmd_test():
    command_struct* test = malloc(sizeof(command_struct));

    test->tID = thread_add(1);
    test->arg_count = arg_count;
    test->arg_p = arg_p;

    threads[test.tID].tID = Thread_Start(test_cmd, test);
    // === end modified code
}

void *test_cmd(void *param)
{ 
    command_struct test = *((command_struct *)param);
    free(param);    // <-- new line of code

    // remainder is the same...
    // ...
}

Problem

I'm trying to pass a pointer of a struct to a function but when I try to access the struct the last variable inside the struct is missing 1 byte off its memory address causing anything using that variable to segfault. ``` typedef struct { pthread_t tID; int tType; }sThread; sThread threads[MAX_THREADS]; typedef struct { int tID; int sock; int arg_count; char *from_p, **arg_p; }command_struct; pthread_t Thread_Start(void *function, void *param) { pthread_t tHandle; pthread_create(&tHandle, NULL, function, (void*)param); return tHandle; } void cmd_test(int sock, char *from_p, char **arg_p, int arg_count) { if(thread_check(1)) { send_line(sock, "%s :test thread already running", from_p); return; } command_struct test; test.tID = thread_add(1); test.arg_count = arg_count; test.arg_p = arg_p; threads[test.tID].tID = Thread_Start(test_cmd, &test); } void *test_cmd(void *param) { command_struct test = *((command_struct *)param); int i = 0; for(i = 1; i < test.arg_count; i++) { printf("%s", test.arg_p[i]); } thread_clear(test.tID); return NULL; } ``` What is happening is inside cmd_test (the function to spawn the thread) the structure is initialized correctly and all variables are correct. ``` $1 = {tID = 0, sock = 5, arg_count = 5, from_p = 0xbffff254 "test", arg_p = 0xbfffec48} ``` But from withing test_cmd which is inside a running thread the structre is missing 1 byte off arg_p's address resulting in: ``` $1 = {tID = 0, sock = 5, arg_count = 5, from_p = 0xbffff254 "test", arg_p = 0xffec48} ``` If I add a useless variable to the end of my command_struct arg_p's address then becomes correct and the last variable in the command_struct is missing 1 byte off it's memory address.

Original source