[英]Why is this function causing a segfault?
我有一個二維數組,我試圖將其傳遞給 function,但每次我嘗試從 function 訪問數組時都會出現分段錯誤
#include <stdio.h>
#define N 100
void create_magic_square(int n, int magic_square[N][N]);
void print_magic_square(int n, int magic_square[N][N]);
int main(void) {
int n;
printf("This program, creates a magic square of a specified size.\nThe size must be an odd number between 1 and 99.\nEnter size of magic square: ");
scanf("%d", &n);
int magic_square[n][n];
create_magic_square(n, magic_square[N][N]);
print_magic_square(n, magic_square[N][N]);
return 0;
}
void create_magic_square(int n, int magic_square[N][N]) {
int i, row, col, next_row, next_col;
for (row = 0; row < n; row++) {
for (col = 0; col < n; col++) {
magic_square[row][col] = 0;
}
}
}
for 循環應該用零填充數組,然后繼續執行 while 循環,但是一旦它達到 'magic_square[row][col] = 0;',我會得到一個 segfault,如下所示:
The size must be an odd number between 1 and 99.
Enter size of magic square: 5
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400894 in create_magic_square (n=5, magic_square=0x2e2f706d) at q2.c:26
26 magic_square[row][col] = 0;
我不知道從這里該怎么做,問題的原因可能是什么?
的類型簽名
void create_magic_square(int n, int magic_square[N][N]);
實際上是:
void create_magic_square(int n, int (*magic_square)[N]);
它需要一個指向數組的第一個元素的指針,該數組的元素是 N 個整數的 arrays。
本聲明:
int magic_square[n][n];
產生一個 C99 可變長度數組 (VLA):一個由 int 的 5 元素 arrays 組成的 5 元素數組。 這與 function 所期望的不兼容。 但是,沒關系,這甚至沒有以任何類似於正確的方式傳遞給 function:
create_magic_square(n, magic_square[N][N]);
在這里,表達式magic_square[N][N]
訪問magic_square
越界(未定義的行為)以檢索一個int
值,然后將其作為指針參數傳遞。 那是違反約束的; 編譯器應該在這里產生一個診斷(可能被表述為關於 integer 到沒有強制轉換的指針轉換)。
我們想要的表達式如下所示:
create_magic_square(n, magic_square);
但要做到這一點,function 必須以正確的方式接收 VLA。
這是您的程序和工作程序之間的差異:
--- magicsquare-ORIG.c 2019-10-10 16:14:50.437827772 -0700
+++ magicsquare.c 2019-10-10 16:17:17.896145951 -0700
@@ -1,8 +1,7 @@
#include <stdio.h>
-#define N 100
-void create_magic_square(int n, int magic_square[N][N]);
-void print_magic_square(int n, int magic_square[N][N]);
+void create_magic_square(int n, int magic_square[n][n]);
+void print_magic_square(int n, int magic_square[n][n]);
int main(void) {
@@ -13,17 +12,28 @@
int magic_square[n][n];
- create_magic_square(n, magic_square[N][N]);
- print_magic_square(n, magic_square[N][N]);
+ create_magic_square(n, magic_square);
+ print_magic_square(n, magic_square);
return 0;
}
-void create_magic_square(int n, int magic_square[N][N]) {
+void create_magic_square(int n, int magic_square[n][n]) {
- int i, row, col, next_row, next_col;
+ int row, col;
for (row = 0; row < n; row++) {
for (col = 0; col < n; col++) {
magic_square[row][col] = 0;
}
}
}
+
+void print_magic_square(int n, int magic_square[n][n]) {
+
+ int row, col;
+ for (row = 0; row < n; row++) {
+ for (col = 0; col < n; col++) {
+ printf("%d,", magic_square[row][col]);
+ }
+ putchar('\n');
+ }
+}
我們丟失了N
宏,添加了print_magic_square
function,正確調用函數,並刪除了一些未使用的局部變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.