将带有2d​​数组的struct传递给线程函数并获取它的索引值

时间:2014-11-26 02:09:30

标签: c arrays linux pthreads 2d

我正在尝试将struct传递给线程。不幸的是,当它发生时,我再也不能使用p [i] [j]了。我收到错误:subscripted value is neither array nor pointer nor vector

    typedef struct MY_M {
      int *p1;
      int *p2;

    } MY_M;



     int *M1[r];

         for (i=0; i<r; i++){
             M1[i] = (int *)malloc(c * sizeof(int));}

    pthread_t thread1;
    struct MY_M *p = malloc(sizeof(struct MY_M));
    p-> p1 = *M1;
    p-> p1 = *M2;
   int ret = pthread_create(&thread1,NULL,thread,(void*) p);



thread here:

    void* thread(void* parameter )
    {

       MY_M **p = (MY_M*)parameter;
       p->p1[0][0] = 5;


    }   

当我评论p [0] [0]时,程序运行正常。为什么不工作?我将不胜感激任何帮助。

2 个答案:

答案 0 :(得分:1)

你实际使用的是一个指针数组(到数组),而不是一个合适的2D数组 - 虽然这不是一个真正的问题。至于为什么它不起作用,你的线程函数中只有p的错误类型 - 它应该是int **而不是int *

答案 1 :(得分:1)

我无法确切地说出你要在这里完成什么,但我可以看到一些错误。

首先,您为p->p1分配两个值。我认为这可能是一个错误,您打算将一个值分配给p->p1,将另一个值分配给p->p2。 (M2来自何处?)

其次,int *M1[r];会将r指针分配给堆栈上的int ,这意味着包含缓冲区的数组将在函数返回后不久失效。

您在分配期间也解除引用M1,这意味着您只指向您分配的第一个缓冲区。再说一次,我无法确切地说出你想要做什么,所以我不知道该推荐什么。

p1也是int*类型,这意味着它包含int的地址,因此它只能被解除引用一次并将解析为int。如果要取消引用它两次(p->p1[x][y]),它应该是int**类型或指向其他一些可解除引用类型的指针。

此外,您将parameter投射到MY_M*,但随后将其分配给MY_M**类型的变量。这是不正确的(事实上,是不是给你一个编译器错误?)

据我所知,您只是尝试分配一些您的线程稍后可以访问的结构。如果是这种情况,代码将是这样的:

typedef struct MY_M {
    int* p1;
    int* p2;
} MY_M;

MY_M* p = (MY_M*)malloc( sizeof(MY_M) );

p->p1 = (int*)malloc( c * sizeof(int) );
p->p2 = (int*)malloc( c * sizeof(int) );

pthread_t thread1;

int ret = pthread_create(&thread1, NULL, thread, (void*)p);

线程在这里:

void* thread(void* parameter)
{
   MY_M *p = (MY_M*)parameter;
   p->p1[0] = 5;
}

总的来说,似乎你并没有完全理解指针。我可以尝试简要介绍一下,但请参考其他指南和参考资料,以完全理解这个概念。

首先:指针是一个地址。因此int* a = &b;表示a类型的int*将包含b的地址,因此指向b }。如果取消引用指针,则表示您获取其保留的地址值,并将地址跟随其原始源。因此*a取消引用a,解析为b中存储的值。

数组索引语法等同于offset + dereferencing,所以当你说p->p1[0][0]时,这实际上等同于*((*(p->p1+0))+0),它将变量解引用两次。

您无法取消引用不是指针的内容(即,不包含地址)。这就是为什么int*无法解除引用的原因。取消引用一次后,它现在是int,它不包含地址,无法解除引用。

我希望这会有所帮助。