c结构和指针分配pthread

时间:2018-10-30 13:56:42

标签: c pointers segmentation-fault structure

我正在做一个作业,我必须用pthreads C处理一些图像。

我具有以下结构:

typedef struct {
    int type;
    int width;
    int height;
    int max_value;
    int *input;
}image;

typedef struct {
    int id; // thread id
    image *in; //input image
}ptf_arguments;

我还有一个函数,我尝试实例化一个structure_b数组并为每个结构分配一个给定structure_a的参数

void resize(image *in, image * out) {
    int i;
    pthread_t tid[num_threads];
    ptf_arguments *arguments[num_threads];
    arguments[0]->in->input = (int *)malloc(in->width * in->height * sizeof(int));
    arguments[0]->in = in; // HERE

    printf("First thread should have id = %d. In image of (%d)\n", arguments[0]->id, arguments[0]->in->width); //here
    for(i = 0 ; i < num_threads; i++) {
        pthread_create(&(tid[i]), NULL, resize_thread_function, &(arguments[i]));
    }
}

1)我不太了解结构,我需要有人向我解释如何将输入/输出图像传递给ptf_arguments结构,以便将其传递给pthreads函数。

2)我需要为图像结构分配内存吗?

3)我是否需要为ptf_arguments结构的图像结构内的int数组分配内存?

谢谢

3 个答案:

答案 0 :(得分:0)

当我阅读代码时,看到了

ptf_arguments *arguments[num_threads];
arguments[0]->in->undefined behavior

在取消引用之前,需要将in指向有效的image结构。最简单的方法可能是将标记为//HERE的行移到上一行的上方。

是的,您还需要分配int的数组,并将input结构的image成员指向该内存。不用说,您需要为每个ptf_arguments对象(而不仅仅是第一个)进行初始化和分配。

我认为您传递单个ptf_arguments对象地址的语法很好。

答案 1 :(得分:0)

结构基本上是您不能更改其子部分的对象。
它最像一个Javascript变量。如果变量是纯文本,则用点varname.subpartname来访问其子部分;如果是指针,则用箭头varname->subpart来访问它的子部分。

结构是变量类型。您不必为它们分配内存(除非使用指针...)

每个子部分必须根据其类型进行初始化。因此,指针子部分必须malloc完全与任何指针一样,或使用现有指针进行定义。

void resize(image *in, image * out) {
    pthread_t tid[num_threads];
    ptf_arguments *arguments[num_threads];
//    arguments[0]->in->input = malloc(in->width * in->height * sizeof(int));
//The preceding line is useless (and also using an uninitialized item). You already have a complete pointer.
    arguments[0]->in = in; // HERE

    printf("First thread should have id = %d. In image of (%d)\n", arguments[0]->id, arguments[0]->in->width); //here
    for(int i = 0 ; i < num_threads; i++) {//Since you only use int i here, you can declare it in the for condition
        pthread_create(&(tid[i]), NULL, resize_thread_function, &(arguments[i]));
    }
}

答案 2 :(得分:0)

  

1)我不太了解结构,我需要有人向我解释如何将输入/输出图像传递给ptf_arguments结构,以便将其传递给pthreads函数。

如果每个线程需要1个结构,请使用pthread_create参数按地址将其传递到arg。就像您已经尝试过的:&(arguments[i])。不过,您可能只想做arguments[i],因为这是一个指针。实际上,您不是在传递地址分配的数据,而是传递本地指针的地址,这是错误且错误的。

重要提示:永远不要将指向局部变量的指针传递给线程!需要使用静态存储持续时间或通过动态分配来分配变量。

如果您没有“很好地理解结构”,则在继续学习诸如多线程之类的高级主题之前,您应该研究它们并进行更多练习。通常,您不能通过反复试验来编程,实际上您需要知道每行键入的内容。没有“抓住机会”。

  

2)我是否需要为图像结构分配内存?

是的。这是您的代码无法正常工作的另一个原因。 ptf_arguments *arguments[num_threads];只是一个指针数组,没有分配用于实际数据的内存。

  
    

3)我是否需要为ptf_arguments结构的图像结构内的int数组分配内存?

  

是的

还请记住在使用完所有内存后free。除非先释放先前使用的资源,否则称为“调整大小”的功能可能不应分配资源。