我想知道我在这里做错了什么?我将void指针转换为struct缓冲区,它只打印出垃圾。现在不应该缓冲指向ptr,它是指向我们为内存分配的原始缓冲区的指针吗?
#include <stdio.h>
#include <pthread.h>
struct buffer{
int a;
char *string[];
}buffer;
void thread1_function(void *ptr){
struct buffer *buffer=(struct buffer*)ptr;
printf("hello world\n");
printf("%s-%n\n", buffer->string,buffer->a);
}
int main(){
struct buffer *buffer;
int err;
buffer = (struct buffer*)malloc((11*sizeof(char))+sizeof(int));
pthread_t thread1;
sprintf(buffer->string,"%s","strint");
buffer->a=1;
printf("main: %s - %d\n",buffer->string,buffer->a);
err = pthread_create(&thread1, NULL, thread1_function, &buffer);
printf("error: %d\n",err);
pthread_join(thread1,NULL);
return 0;
}
〜
答案 0 :(得分:4)
结构的string
成员被定义为char *
指针的“灵活”数组。您似乎将它视为字符数组,方法是为其分配11 * sizeof(char)
个字节,然后将字符串复制到其中。
我认为您的结构的预期布局应如下所示:
struct buffer {
int a;
char string[];
} buffer;
然后将其分配为:
buffer = malloc(sizeof(struct buffer) + SIZE_OF_STRING);
答案 1 :(得分:4)
将指针传递给指向线程结构的指针。尝试将指针传递给结构。 ;)
err = pthread_create(&thread1, NULL, thread1_function, &buffer);
变为
err = pthread_create(&thread1, NULL, thread1_function, buffer);
修改强>
发现另一个错误:线程函数中的printf("...%n")
。 %n
表示将到目前为止写入的数字存储到该位置,该位置的int*
参数指向。你显然在那里%d
表示main()
。
答案 2 :(得分:2)
除了其他人已提供的笔记外:
string
边界。sizeof(struct buffer)
(或者只是在堆栈上创建struct buffer
)以确保分配了足够的内存(可能存在填充问题)。当然,您可能还需要为字符数组和指向它的指针(string
)分配内存并正确初始化。&thread1_function
,即函数指针。另外,thread1_function()
需要返回void*
,而不是void
。buffer
有两个变量(一个在全局范围内,一个在函数内main()
)?你怎么知道你传递给哪一个线程?毕竟,该代码存在许多问题,在修复一个错误之后,我仍然不会感到惊讶。 (实际上我很惊讶它确实编译了。)
这是一些固定的代码:首次编译代码时会有很多警告。你不应该忽视警告。即使您的代码已经编译,警告通常也是追踪错误的有价值信息,尤其是在程序失败时。就像你的情况一样。首先,您不应该关心打印的垃圾,而应该关注编译器向您发出的警告!
(如果您想要更多警告,请尝试将-Wall -Wextra -pedantic
传递给您选择的gcc
。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
struct buffer{
int a;
char string[10];
};
void* thread1_function(void *ptr){
struct buffer *buffer=(struct buffer*)ptr;
printf("hello world\n");
printf("%s-%d\n", buffer->string,buffer->a);
return NULL;
}
int main(){
int err;
pthread_t thread1;
struct buffer *buffer;
buffer = (struct buffer*)malloc(sizeof (struct buffer) );
buffer->a=1;
snprintf(buffer->string, sizeof buffer->string, "%s", "strint");
printf("main: %s - %d\n", buffer->string, buffer->a);
err = pthread_create(&thread1, NULL, &thread1_function, buffer);
printf("error: %d\n", err);
pthread_join(thread1, NULL);
return 0;
}