使用指针的意外结果

时间:2012-09-11 06:45:18

标签: c pointers pass-by-reference

首先,如果你以前见过这个,请道歉。我努力尝试在这里和其他地方找到答案。

我是C的新手,仍然专注于指针和有效使用它们。

代码(为简洁起见编辑):

void getInFile(char fileName[], FILE *inFile) {
    inFile = fopen(fileName, "r");
    if(inFile == NULL) {
        printf("Error1");
    }
}

void function(FILE *inFile) {
    if(inFile == NULL) {
        printf("Error2");
    }
}

int main(int argc, char *argv[]) {
    FILE *inFile = 0;
    getInFile(argv[2], inFile);
    function(inFile);
}

如上所述,运行程序会产生错误2。如果我将getInFile从void更改为FILE *返回类型并且在main方法中有以下内容我得到error1:

inFile = getInFile(argv[2], inFile);

这是我使用指针不正确的例子还是我做错了什么?

5 个答案:

答案 0 :(得分:5)

您需要传递FILE指针的地址,以便函数'getInFile'可以修改它。像这样:

void getInFile(char fileName[], FILE **inFile) {
    *inFile = fopen(fileName, "r");
    if(*inFile == NULL) {
        printf("Error1");
    }
}

然后在主要调用它:

getInFile(argv[2], &inFile);

答案 1 :(得分:1)

void getInFile(char fileName[], FILE *inFile) {
    inFile = fopen(fileName, "r");
    if(inFile == NULL) {
        printf("Error1");
    }
}

您将inFile参数作为参数传递 - 它是按值传递的,无论您是否在函数内部对其进行修改,该函数都在副本上运行,因此改变不会暴露在功能之外的世界。尝试传递其地址(即双指针):

void getInFile(char fileName[], FILE **inFile) {
    *inFile = fopen(fileName, "r");
    if (*inFile == NULL) {
        printf("Error1");
    }
}

FILE *ptr;
getInFile("Filename", &ptr);

答案 2 :(得分:1)

如果你想改变C函数中的某些东西,你需要传递一个指向它的指针并改变它指向的东西。例如:

void xyzzy (int x, int *py) {
    x = 42;
    *py = 42;
}
:
x = y = 0;
xyzzy (x, &y);

会导致x仍然保持为0,而y仍然保持为42.这是因为传递了x副本,而不是真正的{{1} }}。您对该副本所做的任何更改都不会反映给调用者。

指针到y的副本传递(C总是按值传递而不是传递引用)但是,因为该副本和原始{{ 1}}指向相同的 x,它有效。


现在,您还必须将其应用于指针。如果要更改指针,则需要将指针传递给该指针并取消引用它,例如:

&y

答案 3 :(得分:0)

getFile中的赋值对调用者没有任何影响。你需要 制作getFile(FILE ** infile) 并将作业更改为* infile = fopen

答案 4 :(得分:0)

getInFile(argv [2], inFile ); 在这里,inFile是函数的输入参数。没有任何功能可以改变它。如果inFile实际指向某事,函数过程当然会改变指向的变量,但指针本身不能改变。

对于所有参数都是如此,它们永远不能自行更改,如果您想要更改某些内容,则必须指定它。