0

我想知道我在这里做错了什么?我将 void 指针转换为结构缓冲区,它只打印出垃圾。现在 buffer 不应该指向 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;
 }

~

4

3 回答 3

4

结构的string成员被定义为一个“灵活的”char * 指针数组。您似乎将其视为字符数组,而是为其分配11 * sizeof(char)字节,然后将字符串复制到其中。

我认为您的结构的预期布局应如下所示:

struct buffer {
     int a;
     char string[];
} buffer;

然后将其分配为:

buffer = malloc(sizeof(struct buffer) + SIZE_OF_STRING);
于 2012-04-04T07:12:09.857 回答
4

您将指向结构的指针的指针传递给您的线程。尝试将指针传递给结构。;)

err = pthread_create(&thread1, NULL, thread1_function, &buffer);

变成

err = pthread_create(&thread1, NULL, thread1_function, buffer);

编辑: 发现另一个错误:printf("...%n")在线程函数中。%n表示将到目前为止写入的数字存储到该位置,该位置的int*参数指向。你显然是指%d那里,就像你的main().

于 2012-04-04T07:27:06.757 回答
2

除了其他人已经提供的注释外:

  • 您应该使用snprintf来绝对避免超出strings 范围。
  • 您应该使用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;
}
于 2012-04-04T07:39:04.250 回答