gpt4 book ai didi

c - 将带有二维数组的结构传递给线程函数并获取其索引值

转载 作者:行者123 更新时间:2023-11-30 20:14:16 24 4
gpt4 key购买 nike

我正在尝试将结构传递给线程。不幸的是,当它发生时我不能再使用 p[i][j]。我收到错误:下标值既不是数组也不是指针也不是 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] 时,程序运行正常。为什么它不起作用?如果有任何帮助,我将不胜感激。

最佳答案

我无法准确说出您想要在这里完成什么,但我可以看到许多错误。

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

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

您还在分配期间取消引用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; 意味着 int* 类型的 a 将包含 b 的地址,并且因此它指向b。如果您取消引用一个指针,则意味着您获取它所保存的地址值并沿着该地址到达其原始源。因此,*a 取消引用 a,解析为存储在 b 中的值。

数组索引语法相当于偏移+取消引用,所以当你说p->p1[0][0]时,它实际上相当于*((*(p->p1+0))+0),取消引用变量两次。

您无法取消引用非指针的内容(即不包含地址)。这就是为什么你的 int* 不能被取消引用两次。取消引用一次后,它现在是一个 int,它不包含地址,无法取消引用。

我希望这会有所帮助。

关于c - 将带有二维数组的结构传递给线程函数并获取其索引值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27140214/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com