// test.txt
50
13
124
-
void hi ( int *b, FILE *pfile ) {
rewind ( pfile );
int i;
for( i = 0 ; i < 3 ; i++ ) {
fscanf ( pfile, "%d", &b[i] );
}
}
int main ( void ) {
FILE *fp = fopen ( "test.txt", "r" );
int a[10]; //putting extra size for test.
hi ( &a[0], fp );
printf("%d,%d,%d\n", a[0], a[1], a[2]);
fclose ( fp );
return 0;
}
当涉及到阵列时,我试图理解指针。在我测试上面的代码时,我注意到通过将hi ( &a[0], fp )
等不同的索引值添加到hi ( &a[1], fp )
,我会得到不同的结果。
//result of [ hi ( &a[0], fp ) ] //result of [ hi ( &a[1], fp ) ]
50,13,124 junk#,50,13 .
我对结果感到很困惑,因为在&#39; hi&#39; function我从i = 0
指定数组的开头,这意味着它存储从a[0]
开始的值。但似乎将1
而不是0
放在一边以某种方式将值放在一边。为什么会这样?
答案 0 :(得分:6)
如果您将&
视为对单个项目起作用的运算符,这可能对您更有意义,就像-
作用于数字以更改符号一样。在这种情况下,&
将获取您提供的任何地址。对于&a[0]
,您使用a[0]
的地址。对于&a[1]
,您可以使用a[1]
的地址。换句话说,您获取数组的不同元素的地址。因此,在函数中,b
包含您传递给它的地址。就函数所知,传入的是数组的“第一”元素。它对上述任何元素一无所知。
答案 1 :(得分:4)
在第二个示例中,您有一个未定义的行为。您传递数组的第二个元素的地址。然后你扫描所有10个元素。但是因为你传递了第二个元素的地址作为初始元素,最后一个scanf写出了数组之外的元素 - 这是一个错误。
我建议如果你去操作多于数组的元素,也要传递数组的大小
#define ARRAYSIZE(x) (sizeof(x) / sizeof(x[0]))
void hi ( int *b, FILE *pfile, size_t size ) {
rewind ( pfile );
int i;
for( i = 0 ; i < size ; i++ ) {
fscanf ( pfile, "%d", &b[i] );
}
}
和电话
hi ( a, fp, ARRAYSIZE(a));
或
hi ( &a[0], fp, ARRAYSIZE(a));
答案 2 :(得分:3)
你不是'不同大小',而是提供指向数组中第一个元素的指针,然后指向第二个元素。
因为在第二种情况下你给了一个指向第二个元素的指针,并试图读取10个元素(从第2个位置开始)但在第2个元素开始时只有9个有效元素,然后你读入内存不在数组中。