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 %pn", &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

相同的指针

如果你想引用不同的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 %pn", 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;
}

要打印错误内存的地址,请执行

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

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

请注意,如果没有pthread_join()调用,则会将指向新线程的指针传递给一个变量,该变量在循环的下一次迭代中超出范围,这将导致未定义的行为,因此请注意您传递的任何内容的生存期pthread_create

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

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

不错的一个:-(在你的printf声明中,你&p->str---p->str怎么样?

这将使您: Working with pointer 0x6020000000b0 Working with pointer 0x6020000000d0 这似乎更合理。我认为,以前,您正在获取结构成员在内存中的位置的地址。

相关内容

  • 没有找到相关文章

最新更新