我正在尝试将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]时,程序运行正常。为什么不工作?我将不胜感激任何帮助。
答案 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
,它不包含地址,无法解除引用。
我希望这会有所帮助。