#include <stdio.h>
void f(int *app[][20]) {
int i, j;
for (i =0; i< 20; i++){
for (j=0; j<20; j++){
*app[i][j] = i;
}
}
}
int main() {
int app[20][20];
int i, j;
f(&app);
for (i =0; i< 20; i++){
for (j=0; j<20; j++){
printf("i %d, j%d val= %d\n", i, j, app[i][j]);
}
}
return 0;
}
我到底做错了什么?我没有收到任何错误,但存在分段错误,我不知道为什么。
te.c:15:5: warning: passing argument 1 of ‘f’ from incompatible pointer type
f(&app);
^
te.c:3:6: note: expected ‘int * (*)[20]’ but argument is of type ‘int (*)[20][20]’
void f(int *app[][20]) {
void f(int *app[][20]) { /* a 2d array of pointers to int */
应该是
void f(int app[][20]) { /* a pointer to an array of 20 int's */
或
void f(int (*app)[20]) { /* a pointer to an array of 20 int's */
*app[i][j] = i;
应该是
app[i][j] = i; /* you don't need to dereference */
f(&app);
应该是
f(app);
void f(int *app[][20])
应该是
void f(int app[][20])
通话应该是这样的
f(app);
函数
f()
中所做的更改在 main()
中可见
您可以在函数 f()
中访问数组,如 app[i][j]
以下代码正确实现了指向“app[][]”数组的指针的定义和传递给函数“f”
注意“魔法”数字的替换 带有#define'd值
注意原型的正确使用。
随着项目变得越来越大并且由多个文件组成,这将变得非常重要。虽然当项目变成多个文件时,每个源文件都应该有自己的头文件,其中包含该源文件的原型
代码干净地编译并正确运行
#include <stdio.h>
#define ROWS (20)
#define COLS (20)
void f(int app[][COLS]);
int main(void)
{
int app[ROWS][COLS];
int i, j;
f(app);
for (i = 0; i < ROWS; i++)
{
for (j = 0; j < COLS; j++)
{
printf("i %d, j%d val= %d\n", i, j, app[i][j]);
}
}
return 0;
}
void f(int app[][COLS])
{
int i, j;
for (i = 0; i < ROWS; i++)
{
for (j = 0; j < COLS; j++)
{
app[i][j] = i;
}
}
}