【问题标题】:Why file pointer acts different from normal pointer in C language?为什么文件指针的行为与 C 语言中的普通指针不同?
【发布时间】:2021-09-10 01:29:29
【问题描述】:

这是我的 C 代码:

#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"limits.h"

int main(int argc,char **argv){
    int Array[2]={100,150};
    int *pArray=Array;
    int *qArray=pArray;
    qArray++;

    printf("pArray address:%p\n",pArray);
    printf("qArray address:%p\n",qArray);

    if(pArray!=qArray){
        printf("pArray not equals to qArray\n\n");
    }

    FILE *fp1=NULL,
         *fp2=NULL,
         *fp3=NULL,
         *fp4=NULL,
         *fp5=NULL;

    fp1=fopen("test.bin","rb+");
    if(fp1==NULL){
        return 1;
    }

    fp2=fp1;
    fp3=fp1;
    fp4=fp1;
    fp5=fp1;

    fseek(fp2,100l,SEEK_CUR);
    fseek(fp3,200l,SEEK_CUR);
    fseek(fp4,300l,SEEK_CUR);
    fseek(fp5,400l,SEEK_CUR);

    printf("fp1 position:%lu\n",ftell(fp1));
    printf("fp2 position:%lu\n",ftell(fp2));
    printf("fp3 position:%lu\n",ftell(fp3));
    printf("fp4 position:%lu\n",ftell(fp4));
    printf("fp5 position:%lu\n",ftell(fp5));

    if(fp1==fp5){
        printf("fp1 equals to fp5.\n");
    }

    fclose(fp1);
    return 0;
}

这是输出:

$ ./program 
pArray address:0x7ffe5e6780a0
qArray address:0x7ffe5e6780a4
pArray not equals to qArray

fp1 position:1000
fp2 position:1000
fp3 position:1000
fp4 position:1000
fp5 position:1000
fp1 equals to fp5.

我得出一个结论:移动普通指针不会影响与其共享地址的指针,但是移动带有fseek函数的文件指针会影响。

为什么文件指针的行为与普通指针不同?

【问题讨论】:

  • 你不是在比较相同的东西。首先,您要打印几个内存地址,然后是一堆文件偏移量(您从 ftell 获得)。
  • 文件指针不是指向文件中的某个位置,而是指向它的控制结构。它在文件打开时不会更改,您也不能更改它,尽管您可能希望将其设置为NULL在关闭文件之后。你的fp1 ... fp5 都指向同一个控制结构,并访问同一个文件。就像将文件指针传递给函数一样,它将使用文件指针的副本
  • ... 而ftell() 给出的位置是1000,因为这是您进行的fseek() 偏移调用的总和。

标签: c file pointers memory-address file-pointer


【解决方案1】:

FILE * 不是指向文件的指针;它是一个指向FILE 的指针。根据 C 2018 7.21.1 2,FILE 是:

... 一种对象类型,能够记录控制流所需的所有信息,包括其文件位置指示符、指向其关联缓冲区的指针(如果有)、错误指示符发生了读/写错误,并有一个文件结束指示器记录是否已到达文件末尾……

因此fp2=fp1; 使fp2 指向用于控制文件的同一对象,因此对fp1 指向的对象所做的任何更改都会出现在fp2 指向的对象中,反之亦然反之亦然,因为它们是同一个对象。

qArray++ 更改指针 qArrayfseek(fp2,100l,SEEK_CUR); 更改fp2 指向的对象(以及它控制的流)。同样,如果你调用了一些例程ChangeAnElementInArray(qArray, index, value),那会改变数组中的一个元素;它不会改变 qArray 指针。

另外,FILE * 不是文件中的位置。它只是一个指向用于控制流的数据结构的指针。

【讨论】:

  • 谢谢,我现在对FILE指针有了更好的理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-19
  • 2016-10-30
  • 1970-01-01
  • 2013-06-27
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
相关资源
最近更新 更多