线程和指针C.

时间:2012-04-04 07:08:31

标签: c multithreading pointers structure

我想知道我在这里做错了什么?我将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;
 }

3 个答案:

答案 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)

除了其他人已提供的笔记外:

  • 你应该使用snprintf来绝对避免写string边界。
  • 您应该使用sizeof(struct buffer)(或者只是在堆栈上创建struct buffer)以确保分配了足够的内存(可能存在填充问题)。当然,您可能还需要为字符数组和指向它的指针(string)分配内存并正确初始化。
  • 查看pthread_create的人工页面,第三个参数应该是&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;
}