我正在處理C中的一些計算物理問題,並且我在代碼中遇到了一些困惑。我花了最後幾周閱讀C,但我仍然對這種語言不熟悉。我需要在二維數組上工作。每行的長度可能會有所不同,例如,我可能想要使用:創建和修改「三角形」矩陣:[[0,1,2][1,2][2]]
。在C中的函數中爲2D數組分配空間?
爲了以可維護,易於閱讀和修改的方式構建我的代碼,我想將部分邏輯移到一個函數中。但是,這似乎比我預期的更困難。
我開始,我創建一個int **matrix
變量,並傳遞給函數的方法,用ampersand前綴並接受一家三星級INT:int ***
,並與矩陣*matrix[i][j]
工作。我無法得到它的工作,但matrix[0][i][j]
工作和我只是無法讓我的頭。這兩個概念不一樣嗎?
這裏是我的代碼:
void alloc_subscript_notation(int number_of_rows, int *** matrix) {
matrix[0] = malloc(number_of_rows * sizeof(int *));
for (int i = 0; i < number_of_rows; i++)
matrix[0][i] = calloc((number_of_rows-i), sizeof(int));
}
void modify_subscript(int number_of_rows, int *** matrix) {
matrix[0][0][1] = 8; // just set a value of an element to 8, as a proof of concept
}
void subscript_notation (int number_of_rows, int *** matrix) {
alloc_subscript_notation(number_of_rows, matrix);
modify_subscript(number_of_rows, matrix); // I can even modify it
}
void alloc_star_notation(int number_of_rows, int *** matrix) {
*matrix = malloc(number_of_rows * sizeof(int *));
for (int i = 0; i < number_of_rows; i++)
*matrix[i] = calloc((number_of_rows-i), sizeof(int));
printf("alloc_subscript_notation: zeros: %d, %d, %d\n", // just a few examples
*matrix[0][2], *matrix[1][1], *matrix[2][0]);
}
void star_notation (int number_of_rows, int *** matrix) {
// SEGMENTATION FAULT!!!
alloc_star_notation(number_of_rows, matrix);
}
int main (void) {
int ** matrix;
int number_of_rows = 3; // it's dynamic in my program, but I use it this hard-coded value for clarity
// I want to be able to access matrix elements here
// All good here.
subscript_notation(number_of_rows, &matrix);
printf("subscript_notation ready. main: "
" %d, %d, %d, modified: %d\n",
matrix[0][2], matrix[1][1], matrix[2][0], matrix[0][1]);
// Segmentation Fault
star_notation(number_of_rows, &matrix);
}
你知道如何讓一維數組工作嗎? –
'alloc_star_notation'由'alloc_subscript_notation'分配的內存泄漏 – LPs
順便說一句,使用你的代碼,你正在使用指針指針,這不是一個二維數組...... – LPs