如果main()中的多维数组从函数指针初始化,如下所示:
#include <stdio.h>
void arrayfunction(int (*n)[3][3])
{
(*n)[0][2]=7;
printf("Function output: %i\n", *n[0][2]);
}
main()
{
int y[3][3];
arrayfunction(&y);
printf("Main output: %i \n",y[0][2]);
return(0);
}
然后main()中的数组将保存正确的值,但arrayfunction()中指针的输出不会:
Function output: 4195805
Main output: 7
但是,如果函数通过函数指针通过fscanf()初始化main()中的数组:
#include <stdio.h>
void readSchedule(int (*s)[3][3]){
FILE *schedule;
schedule=fopen("/var/schedule.conf","r");
fscanf(schedule,"[%i,%i,%i,%i]\n",s[0][0], s[0][1], s[0][2], s[0][3]);
fclose(schedule);
printf("Function output value: %i\n",*s[0][2]);
}
main()
{
int x[3][3];
readSchedule(&x);
printf("Main output value: %i\n ",x[0][2]);
return(0);
}
然后值反转,函数本地的指针将输出正确的值,但它指向main()的数组不会:
Function output value: 7
Main output value: 0
为什么正确的值只显示在第一个示例中main()的本地数组中,但只显示在第二个示例中函数的本地指针中?
答案 0 :(得分:1)
检查运算符优先级,并使用arrayFunction中的n
注意两行中的差异
(*n)[0][2]=7;
printf("Function output: %i\n", *n[0][2]);
括号在这里至关重要。 []
运算符的优先级高于*
(http://en.cppreference.com/w/cpp/language/operator_precedence)。如果在printf行中添加括号,您将看到您的期望。
fscanf
示例或多或少地发生了同样的事情。编译器将s[0][0]
视为指向int的指针(如此*(s [0] [0])),因此数据将被写入未定义的区域。
如果你使用像valgrind这样的内存调试程序,你会发现很多错误。
答案 1 :(得分:1)
第一个例子中的问题是通过改变优先级来解决函数内部printf语句中指向数组参数的语法:
printf("Function output: %i\n", *n[0][2]);
到
printf("Function output: %i\n", (*n)[0][2]);
在第二个例子中,fscanf()显然是将值直接填充到* s [] []中,而不是间接初始化main()中* s [] []指向的数组。所以不要这样:
fscanf(schedule,"[%i,%i,%i,%i]\n",s[0][0], s[0][1], s[0][2], s[0][3]);
语法必须是这样的:
fscanf(schedule,"[%i,%i,%i,%i]\n",&(*s)[0][0], &(*s)[0][1], &(*s)[0][2], &(*s)[0][3]);
为了通过* s [] []到达并将值放在y [] []。
中