Почему malloc назначает уже выделенную позицию в памяти? - PullRequest
0 голосов
/ 01 октября 2018

Я знаю, что malloc должен использовать нераспределенную память при вызове несколько раз, если она не была предварительно освобождена.Однако здесь не работает, любая помощь здесь будет высоко ценится.

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

struct thread_params
{
    char *str;
};

void *threadFunc(void* parameters)
{
    struct thread_params* p = (struct thread_params*) parameters;

    printf("Working with pointer %p\n", &p->str);

    return NULL;
}

int main(void)
{
    int i;
    for (i=1; i<=2; i++) {
        pthread_t tid;
        struct thread_params thread_args;
        char *a = malloc(sizeof(char));
        thread_args.str = a;
        pthread_create(&tid, NULL, &threadFunc, &thread_args);
        pthread_join(tid, NULL);
    }

    return 0;
}

Это выводит

Working with pointer 0x7ffeec881b28
Working with pointer 0x7ffeec881b28

тот же указатель

Ответы [ 4 ]

0 голосов
/ 01 октября 2018

Чтобы напечатать адрес вашей памяти malloc, выполните

  printf("Working with pointer %p\n", p->str);

У вас есть код, который не печатает адрес памяти, возвращенный функцией malloc (), он печатает адрес str переменная в структуре thread_params.Этот адрес, вероятно, будет одинаковым каждый раз, так как местоположение вашей переменной thread_args, вероятно, не меняется между итерациями цикла.

Обратите внимание, что без вызова pthread_join() вы передадите указатель нановый поток для переменной, которая выходит из области видимости на следующей итерации вашего цикла, что может привести к неопределенному поведению, поэтому следует учитывать время жизни всего, что вы передаете в pthread_create

0 голосов
/ 01 октября 2018

Хороший :-) В вашем printf утверждении у вас есть &p->str --- как насчет p->str вместо?

Это даст вам: Working with pointer 0x6020000000b0 Working with pointer 0x6020000000d0 , что кажется более разумным.Думаю, раньше вы получали адрес того, где находится член структуры.

0 голосов
/ 01 октября 2018

Вы не печатаете адрес, возвращенный malloc().Вы печатаете &p->str, который является адресом члена структуры.Компилятор использует одну и ту же память для структуры каждый раз в цикле, поэтому адрес члена str не меняется.

Измените &p->str на p->str, и вы напечатаетеадрес, возвращаемый malloc().

0 голосов
/ 01 октября 2018

Если вы хотите сослаться на разные thread_args, вам понадобится их массив.Кроме того, вы, скорее всего, хотите напечатать указатель на str, а не на &address этого указателя.

Там только один thread_args, и вы просто печатаете адрес одного из его членов (указатель).Не значение этого указателя.

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

struct thread_params
{
    char *str;
};

void *threadFunc(void* parameters)
{
    struct thread_params* p = (struct thread_params*) parameters;

    printf("Working with pointer %p\n", p->str);

    return NULL;
}

int main(void)
{
    int i;
    for (i=1; i<=2; i++) {
        pthread_t tid;
        struct thread_params thread_args;
        char *a = malloc(sizeof(char));
        thread_args.str = a;
        pthread_create(&tid, NULL, &threadFunc, &thread_args);
        pthread_join(tid, NULL);
    }

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...