c - 在共享内存 inc C 中存储带有 vector 的结构

标签 c matrix shared-memory

我正在尝试将二维数组(矩阵)存储在共享内存中。我正在使用 ubuntu 和 C。

这是我的代码:

结构

typedef struct {
    int data[COLUN_CAP];
} Colonna;

typedef struct {
    int nc;
    key_t colK;
    Colonna colonne[10];
} Matrix;

启动矩阵的函数:

void iniz_mat(Matrix *M, int n) {
    M->nc = n;
    int i, k;
    for (i = 0; i < M->nc; i++) {      
        printf("Colonna: %d \n", i);
        for (k = 0; k < COLUN_CAP; k++) {  
            M->colonne[i].data[k] = rand() % 10;
        }
    }
}

主程序

key_t shmKM;   
int n;

shmKM = ftok(PATH_SHM, CHAR_SHMM);
scanf("%d", &n);
int idshmM = shmget(shmKM, sizeof(Matrix) + sizeof(Colonna) * 10, IPC_CREAT | 0664);
Matrix *Mat;
Mat = (Matrix *)shmat(idshmM, 0, 0);
iniz_mat(Mat, n);

我收到段错误(核心转储)错误。我想存储一个列数可变的矩阵,但显然我不能存储一个固定的矩阵。提示?


编辑: 因此,对于可变数量的列,我尝试了:

typedef struct {
    int nc;
    key_t colK;
    Colonna colonne[];
} Matrix;

当然还有:

int idshmM = shmget(shmKM, sizeof(Matrix) + sizeof(Colonna) * n, IPC_CREAT | 0664);

它没有给出任何错误,但是当我打印矩阵时,我只得到每列的前两行。

打印函数的代码如下:

void print_matrix(Matrix *M) {
    int i, k;
    for (k = 0; k < COLUN_CAP; k++) {
        for (i = 0; i < M->nc; i++)
            printf("%d  ", M->colonne[k].data[i]); 
        printf("\n");      
    }
}

所以我得到了矩阵的视觉表示。 COLUN_CAP 是每一列的元素个数,设置为5


哦打印功能是错误的(倒置i和k)我觉得很愚蠢。感谢大家的帮助!

最佳答案

在您的示例代码中,为什么要为 10 个 Colonna 结构分配空间? Matrix 最多可容纳 10 个 Colonna,处理超过 10 将需要一个灵活的数组。使用灵活的数组,您可以为适当数量的 Colonna 结构分配空间,并以可移植的方式对它们进行寻址。使用这个:

typedef struct {
    int data[COLUN_CAP];
} Colonna;

typedef struct {
    int nc;
    key_t colK;
    Colonna colonne[];
} Matrix;

int idshmM = shmget(shmKM, sizeof(Matrix) + sizeof(Colonna) * n, IPC_CREAT | 0664);

此外,您应该检查 shmgetshmat 系统调用中的错误。 shmat 在出错时返回 (void *)-1。使用 strerror() 输出信息性错误消息。

关于c - 在共享内存 inc C 中存储带有 vector 的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36120246/

相关文章:

c - 像下面这样使用 exec() 的函数的返回值是多少?

c - 如何从hsearch中删除元素

c - "expr1 ? expr 2 : expr 3"的解释?

c - C中的矩阵乘法总是返回0?

c++ - 内核模式 - 通过共享内存进行用户模式通信,无需使用系统线程

c - C 中的象限查询会出现段错误

r - 收到错误 "number of items to replace is not a multiple of replacement length"

java - 为什么有时位图是相同的对象?

php共享内存读取全0

python - 如何在进程之间共享日期变量 - Multiprocessing python