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