【问题标题】:Bidimensional Array and pointers in CC中的二维数组和指针
【发布时间】:2021-05-09 19:36:43
【问题描述】:

我对这段代码有一个问题:我不知道如何将引用传递给结构中的矩阵。

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

struct detA{
    int** matrix;
    int flag;
    int result;
};

void* det3x3 (void* arguments){

    struct detA* tmp = (struct detA *) arguments;

    if(tmp->flag){
        /*Quando il flag è uno sono nel thread A*/
        tmp->result = (tmp->matrix[0][0] * tmp->matrix[1][1] * tmp->matrix[2][2]) +
                        (tmp->matrix[0][1] * tmp->matrix[1][2] * tmp->matrix[2][0]) +
                        (tmp->matrix[0][2] * tmp->matrix[1][0] * tmp->matrix[2][1]);

        return (void*)&(tmp->result);
    }
    else{
        /*Quando il flag è zero sono nel thread B*/
        tmp->result = (tmp->matrix[2][0] *tmp->matrix[1][1] * tmp->matrix[0][2]) +
                        (tmp->matrix[2][1] * tmp->matrix[1][2] * tmp->matrix[0][0]) +
                        (tmp->matrix[2][2] * tmp->matrix[1][0] * tmp->matrix[0][1]);

        return (void*)&(tmp->result);
    }

}

int main(){

    pthread_t t1_id;
    pthread_t t2_id;

    int* t1_returnValue;
    int* t2_returnValue;

    int A [3][3] = {{1,1,1}, {1,1,1}, {1,1,1}};

    struct detA t1_args;
    struct detA t2_args;

    t1_args.matrix = A;
    t1_args.flag = 1;

    t2_args.matrix = A;
    t2_args.flag = 0;

    pthread_create(&t1_id, NULL, &det3x3, &t1_args);
    pthread_create(&t2_id, NULL, &det3x3, &t2_args);

    pthread_join(t1_id, (void**)&t1_returnValue);
    pthread_join(t2_id, (void**)&t2_returnValue);

    int det = (*t1_returnValue) - (*t2_returnValue);
    printf("Il determinante della matrice è: %d", det);

    return 0;
}

编译此代码时,将矩阵分配给 int** 时出现错误。 会是什么呢?在之前的练习中,我通过在结构中放入一个 int * 对普通数组进行了同样的操作。

【问题讨论】:

    标签: c pointers matrix


    【解决方案1】:

    当您在内存中声明矩阵A 时,会分配连续内存来存储矩阵的所有元素。因此,您希望转换为int*,因为您获得了指向矩阵A 的内存位置的指针。而int** 是指向指针位置的指针。这意味着当它被取消引用时,您所在的内存位置包含一个可以再次取消引用的指针数组。但是,在上面的代码中情况并非如此。取消引用后,您将直接转到元素在内存中的位置,而不是指针数组的位置。

    【讨论】:

    • 所以在结构中我需要一个int*?因为我已经尝试过了
    • 是的,你明白了!
    • 但是还是不行 :( 我收到这个错误es3.c:25:38: error: subscripted value is neither array nor pointer nor vector 25 | tmp-&gt;result = (tmp-&gt;matrix[0][0] * tmp-&gt;matrix[1][1] * tmp-&gt;matrix[2][2]) +
    【解决方案2】:

    数组衰减为指针只发生在多维数组的最外层。

    这意味着int [3][3] 类型的数组不会衰减为int **,而是衰减为int (*)[3],即指向int 大小为3 的数组的指针。所以这是您应该为struct detAmatrix 成员使用的类型:

    struct detA{
        int (*matrix)[3];
        int flag;
        int result;
    };
    

    【讨论】:

    • 我改了还是编译出错。现在编译器说结构中没有名为 ''matrix'' 或 ''flag'' 的成员。
    • @ToniGun 你可能有错字。该成员应声明为int (*matrix)[3];
    • 解决了!谢谢!
    猜你喜欢
    • 2019-11-25
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 2013-09-04
    • 2013-01-26
    相关资源
    最近更新 更多