修改C中函数内的数组

时间:2017-08-12 23:14:01

标签: c arrays function pointers

// 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放在一边以某种方式将值放在一边。为什么会这样?

3 个答案:

答案 0 :(得分:6)

如果您将&视为对单个项目起作用的运算符,这可能对您更有意义,就像-作用于数字以更改符号一样。在这种情况下,&将获取您提供的任何地址。对于&a[0],您使用a[0]的地址。对于&a[1],您可以使用a[1]的地址。换句话说,您获取数组的不同元素的地址。因此,在函数中,b包含您传递给它的地址。就函数所知,传入的是数组的“第一”元素。它对上述任何元素一无所知。

答案 1 :(得分:4)

在第二个示例中,您有一个未定义的行为。您传递数组的第二个元素的地址。然后你扫描所有10个元素。但是因为你传递了第二个元素的地址作为初始元素,最后一个scanf写出了数组之外的元素 - 这是一个错误。

enter image description here

我建议如果你去操作多于数组的元素,也要传递数组的大小

#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个有效元素,然后你读入内存不在数组中。