为什么malloc分配一个已经分配的内存位置?

时间:2018-10-01 19:31:16

标签: c malloc

我知道,多次调用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 :(得分:3)

如果要引用不同的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;
}

答案 1 :(得分:2)

要打印已分配的内存的地址,请执行

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

您拥有的代码不是打印malloc()返回的内存的地址,而是打印str结构内的thread_params变量的地址。 该地址可能每次都相同,因为thread_args变量的位置在两次循环迭代之间可能不会改变。

请注意,如果没有pthread_join()调用,您将向新线程传递一个指向变量的指针,该变量在循环的下一次迭代时超出范围,这将导致未定义的行为,因此请注意您传入pthread_create

的时间

答案 2 :(得分:0)

您没有打印malloc()返回的地址。您正在打印&p->str,这是结构成员的地址。每次循环时,编译器都会在结构中使用相同的内存,因此str成员的地址不会更改。

&p->str更改为p->str,您将打印malloc()返回的地址。

答案 3 :(得分:-1)

很好:-)在您的printf语句中,您有&p->str --- p->str呢?

这将使您: Working with pointer 0x6020000000b0 Working with pointer 0x6020000000d0 这似乎更合理。我认为,以前您是获得struct成员在内存中的地址的。