我試圖在共享存儲器中存儲二維數組(矩陣)。我使用的是Ubuntu和C.在共享存儲器inc中存儲一個帶有向量的結構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);
我ge t分段錯誤(核心轉儲)錯誤。我正在尋找一個列數可變的矩陣,但顯然我不能存儲一個固定的矩陣。提示?
編輯: 所以,我試着列可變量:
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)我覺得很愚蠢。感謝大家的幫助!
代碼中沒有2D數組。沒有什麼可以作爲一個合適的語義使用。 – Olaf
我怎麼能將這個結構存儲在共享內存中? – alteration
建議您首先添加錯誤檢查代碼以驗證所有函數的返回值。如果沒有顯示錯誤,則使用調試器。最後,如果您仍然無法解決問題,請發佈[最少完整且可驗證的示例](https://stackoverflow.com/help/mcve),其中包含輸入值。 – kaylum