2013-10-11 2 views
0

Я пытаюсь распределить память динамически для arg_struct. Если я просто выделил его в стеке, он работает правильно, но не динамически. Динамически он печатает строку в основной функции, но когда она передается функции потока, она не работает. Любые идеи относительно того, почему это не работает?Выделение структуры кучи и стека: Pthread_create

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 


struct arg_struct { 
    int *arg1; 
    char *str; 
}; 

void *print_the_arguments(void *arguments) 
{ 
    struct arg_struct *args = (struct arg_struct *)arguments; 
    printf("The result is : %s\n",args->str); 
    pthread_exit(NULL); 
    return NULL; 
} 

int main() 
{ 
    pthread_t some_thread; 
    struct arg_struct *args = malloc(sizeof(struct arg_struct)); 
    //struct arg_struct args; // uncommenting this and args.str WORKS (prints to thread function) 
    args->str = malloc(sizeof(char)*6); 
    args->str = "hello"; 
    //args.str = "hello"; 
    printf("printing from main: %s\n", args->str); // Prints here but not in other function 

    if (pthread_create(&some_thread, NULL, &print_the_arguments, (void *)&args) != 0) { 
     printf("Uh-oh!\n"); 
     return -1; 
    } 

    return pthread_join(some_thread, NULL); /* Wait until thread is finished */ 

} 
+0

Это: 'args-> str = malloc (sizeof (char) * 5); args-> str = "hello"; 'выделяет пять байтов (когда вам кажется, что нужно 6), а затем сразу же теряет эту память, когда вы присваиваете что-то еще' args-> str'. –

+0

В будущем удалите эти номера строк перед отправкой. – hauzer

ответ

4

Этот

29  if (pthread_create(&some_thread, NULL, &print_the_arguments, (void *)&args) != 0) { 

должен быть

29  if (pthread_create(&some_thread, NULL, &print_the_arguments, (void *)args) != 0) { 

при динамическом распределении арг. Кроме того, я бы посоветовал

25  args->str = strdup("hello"); 

и пропустить malloc.

Этот код:

24  args->str = malloc(sizeof(char)*5); 
25  args->str = "hello"; 

приводит к утечке памяти, память от таНос просочилась. Возможно, вы имели в виду

24  args->str = malloc(sizeof(char)*5); 
25  strcpy(args->str, "hello"); 

, но это неверно. 5 должно быть 6 для учета нулевого символа в конце строки. strdup() является хорошим ярлыком для malloc, за которым следует strcpy.

+0

+1, личность в 'void *', '&' перед 'print_the_arguments' и' sizeof (char) 'в коде OP также не нужна. –

+0

Возможно, не нужно, но, не нужно? Этот код был с другой страницы stackoverflow; Я немного изменил его. Кроме того, на этой странице есть листинг для void *. https://computing.llnl.gov/tutorials/pthreads/ Этот сайт также использует sizeof (char): http://stackoverflow.com/questions/8600181/allocate-memory-and-save-string-in-c –

Смежные вопросы