我知道 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
这似乎更合理。我认为,以前,您正在获取结构成员在内存中的位置的地址。