試圖以 C 語言初學者的身份理解指標-我有這個結構:
typedef struct {
int size; // dimension of array
int **arr; // pointer to heap allocated array
} someStruct;
所以我使用 malloc 生成這個結構和一個陣列,并將所有值初始化為零-
someStruct *m = (someStruct*)malloc(sizeof(someStruct));
m->size = n;
m->arr = (int**)malloc(n * sizeof(int));
// initialize array
for (int i = 0; i < n; i ) {
*(m->arr i) = (int*)malloc(n * sizeof(int));
// set value to 0
for (int j = 0; j < n; j ) {
*(*(m->arr i) j) = 0;
}
}
在此之后,我基本上繼續使用相同型別的指標邏輯在后期訪問陣列 -
for (int i = 0; i < n; i ) {
for (int j = 0; j < n; j ) {
int num = *(*(m->arr i) j);
printf("num: %d\n", num);
}
}
這就是問題所在——當我嘗試使用這種訪??問方法時,我顯然沒有得到正確的答案——我的列印輸出如下所示:
num: -2043774080
num: 22031
num: 0
num: 0
...
num: 0
num: 0
這是真正奇怪的部分-這種“奇怪”亂數的錯誤似乎僅在我創建和訪問大小為 5 的陣列時出現-
我開始相信整個
*(*(m->arr i) j)
訪問方法一定是錯誤的——對此的任何幫助都會非常有用。在此先感謝,如果已經回答,我很抱歉,我的搜索無法找到它。
uj5u.com熱心網友回復:
您應該提供完整的代碼,但我想我能夠弄清楚您的意圖。你有一個明顯的問題,還有許多風格問題。這是我認為您的代碼應如下所示:
typedef struct {
int size; // dimension of array
int **arr; // pointer to heap allocated array
} MagicSquare;
:
:
// no need to dynamically allocate this, it is small
MagicSquare m;
m.size = n;
m.arr = malloc(n * sizeof(int*)); // note it is sizeof(int*), not (int)
// initialize array
for (int i = 0; i < n; i ) {
m.arr[i] = malloc(n * sizeof(int));
// set value to 0
for (int j = 0; j < n; j ) {
m.arr[i][j] = 0;
}
}
:
:
for (int i = 0; i < n; i ) {
for (int j = 0; j < n; j ) {
printf("num: %d\n", m.arr[i][j]);
}
}
請注意,如果您想將分配的記憶體初始化為零,您應該只使用calloc,它會為您執行此初始化:
// initialize array
for (int i = 0; i < n; i ) {
m.arr[i] = calloc(n,sizeof(int));
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/431169.html
上一篇:RewriteBase去哪兒了?
