簡體   English   中英

為什么這個 function 會導致段錯誤?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM