我知道,多次调用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
相同的指针
答案 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成员在内存中的地址的。