簡體   English   中英

我可以將int傳遞給C中的void函數嗎?

[英]Can I pass an int to a void function in C?

我正在嘗試使用函數讓用戶輸入n x n方陣並將其打印出來。

輸入矩陣的函數是: ucitajmatricu

並打印出來: ispisimatricu

#include < stdio.h > 
#include < stdlib.h >

void ucitajmatricu(int);
void ispisimatricu(int);

int main() {
  int n;
  scanf("%d", & n);

  ucitajmatricu(n);
  ispisimatricu(n);

  return 0;
}

void ucitajmatricu(int n) {
  int i, j;

  int MAT[n][n];

  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      scanf("%d", & MAT[i][j]);
    }
  }
  printf("\n");

  return;
}

void ispisimatricu(int n) {
  int i, j, MAT[n][n];
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      printf("%d\t", MAT[i][j]);
    }
    printf("\n");
  }

  return;
}

輸入示例: 3

1 2 3
4 5 6
7 8 9

輸出示例:

1 2 3
4 5 6
7 8 9

實際輸出:

1 2 3
4 5 6
7 48 0

void ucitajmatricu(int n){
...
int MAT [n] [n];

...

void ispisimatricu(int n){
int i,j,MAT [n] [n];

MAT [] []的兩個聲明具有不同的功能-它們不保留其值,並且它們具有相同的名稱並不重要。

在函數外聲明一次MAT [] []。 而且,順便說一句,這個問題似乎與問題的標題無關。

評論后編輯

該程序似乎只能工作,部分原因是在第一個調用中讀取了值並將其存儲在本地數組(在堆棧中)中。 第二個被調用函數具有相似(如果不相同)的堆棧框架,因此在第二個調用中聲明和實例化的框架幾乎覆蓋了前一個框架,即100%。 第二個函數似乎保留了大部分值,但這只是運氣(或運氣...)。 如果在這兩次調用之間還有其他對其他函數的調用,則堆棧將更容易損壞(很好,被覆蓋),並且部分工作的效果將降低。

OP程序中的錯誤類型令人討厭,因為堆棧“幸運地”保留了部分值,但“不幸地”,這一事實掩蓋了真正的問題:局部變量在函數退出后消失了。

為了詳細說明以上答案,當您在函數中聲明變量時,即在堆棧上聲明它。

您可以全局聲明和初始化,但這與您想要執行的操作不同。 在某些方面更容易,因為取決於堆棧內存,但更嚴格。

要使用當前的實現,請改為通過在堆上分配來初始化矩陣。 使用calloc()分配空間並將其清零。 然后,當您返回時,將指針返回到矩陣。 缺點是需要更多的內存管理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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