[英]Store a struct with vectors in shared memory inc C
我正在嘗試將2D數組(矩陣)存儲在共享內存中。 我正在使用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);
此外,您應該檢查shmget
和shmat
系統調用中的錯誤。 shmat
返回(void *)-1
出錯。 使用strerror()
輸出信息錯誤消息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.