从C中的fscanf()初始化时不一致的数组值

时间:2015-10-24 01:58:04

标签: c arrays pointers scanf

如果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()的本地数组中,但只显示在第二个示例中函数的本地指针中?

2 个答案:

答案 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 [] []。