我正在嘗試在結構中動態分配多個矩陣,我找到了一種方法,但它使所有矩陣的大小相同,我需要它們具有不同的大小
#include <stdio.h>
#include<stdlib.h>
#include <stdbool.h>
struct matrice_dinamica{
int linii, coloane;
int **matrice;
} v[100], aux;
void comanda_L_citire_matrice(int i)
{
scanf("%d %d", v[i].linii, v[i].coloane);
v[0].**matrice = (int **) malloc(v[i].linii * sizeof(int *));
for(int i = 0; i < v[i].linii; i ){
*(v[0].**matrice i) = (int *)malloc(v[i].coloane * sizeof(int));
}
}
我試圖這樣做,但它給出了一個我無法擺脫的錯誤:“‘*’令牌之前的預期識別符號”
uj5u.com熱心網友回復:
我會避免雙指標,因為它引入了更多的間接性并使分配和自由程序復雜化。
#define GET(str, row, col) ((int (*)[col])(str).matrice)[row][col]
#define PUT(str, row, col, val) ((int (*)[col])(str).matrice)[row][col] = (val)
struct matrice_dinamica{
size_t linii, coloane;
void *matrice;
} v[100];
struct matrice_dinamica *comanda_L_citire_matrice(size_t i)
{
struct matrice_dinamica *result = NULL;
if((i < sizeof(v) / sizeof(v[0])))
if(scanf("%zu %zu", &v[i].linii, &v[i].coloane) == 2)
{
int (*ptr)[v[i].coloane] = malloc(v[i].linii *sizeof(*ptr));
v[i].matrice = ptr;
result = &v[i];
}
return result;
}
/* example usage */
int foo(size_t r, size_t c, size_t x, int y)
{
printf("%d", GET(v[5], 5, 6));
PUT(v[x], r, c, y);
}
uj5u.com熱心網友回復:
從上面的評論中,修復代碼(未完全測驗):
#include <stdio.h>
#include <stdlib.h>
struct matrice_dinamica{
int linii, coloane;
int **matrice;
} v[100];
void comanda_L_citire_matrice(int i)
{
if(i < 0 || i >= 100 || scanf("%d %d", &v[i].linii, &v[i].coloane) != 2) {
/* handle error */
}
v[i].matrice = malloc(v[i].linii * sizeof(int *)); // don't cast malloc
for(int j = 0; j < v[i].linii; j ){ // distinct variable j
v[i].matrice[j] = malloc(v[i].coloane * sizeof(int)); // corrected [0] index
}
}
概括
- 不提供
&地址運算子scanf - 不檢查結果
scanf - 不檢查索引范圍
i用回圈變數隱藏引數i- 索引元素
[0]而不是[i] - 不要強制轉換回傳值
malloc - 記憶體分配中的錯誤語法
代碼還應該檢查malloc不回傳NULL。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/537354.html
標籤:数组C多维数组结构动态的
上一篇:如何使用for-each回圈將多維陣列輸出到控制臺?
下一篇:Python查詢-陣列
