指针没有在C中保持值

时间:2017-12-03 03:33:03

标签: c file pointers reference

我正在尝试获取一个值列表,以便在运行此代码时进行更新,但我的目的就在于结束。在readFile()函数中输出是正确的,但是,在PY2014的main()函数中它是错误的,我无法弄清楚原因。

#include <stdio.h>
#include <stdlib.h>

void readFile(char *myFile, int *firstYear, int *secondYear,
                         int *thirdYear, int PY2014[]) {
int firstThree[3];
int i = 0;

FILE *fp = fopen(myFile, "r");

for (i = 0; i < 3; i++ ) {
    fscanf(fp, "%d", &firstThree[i]);
}

*firstYear = firstThree[0];
*secondYear = firstThree[1];
*thirdYear = firstThree[2];

PY2014 = (int*)calloc(*firstYear, sizeof(int));

for (i = 0; i < firstThree[0]; i++) {
    fscanf(fp, "%d", (PY2014 + i));
}

for (i = 0; i < *firstYear; i++) {
    printf("PY2014 Function: %d\n", PY2014[i]);
}

fclose(fp);
}

int main(int argc, char *argv[]) { 
    int init1 = 2, init2 = 3, init3 = 4, init4[10];
    int *firstYear = &init1;
    int *secondYear = &init2;
    int *thirdYear = &init3;
    int *PY2014 = init4;


    readFile(argv[2], firstYear, secondYear, thirdYear, PY2014);

    printf("firstYear : %d\n", *firstYear);
    printf("secondYear : %d\n", *secondYear);
    printf("thirdYear : %d\n", *thirdYear);

    for (int i = 0; i < *firstYear; i++) {
        printf("PY2014: %d\n", *(PY2014+i));
    } 
}

我给它的输入文件是一个整数列表,每个整数用newLine分隔。例如,如果.txt文件成立     8     15     15     59     154     266     435     267     -5     21     269 代码应该在前3个进入PY2014之后读取最后8个值。当我当前运行它时,readFile中的print循环得到正确的数字,但是当在main()中调用循环时它只是零。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

问题是你传递一个指针,然后你分配内存并将它的地址分配给传递的指针。然后范围结束,并且对被调用函数中的本地指针变量所做的更改将丢失。您尝试在main()中打印一些未初始化的值。在你的情况下,它结果是零。(垃圾值)。

如果您打算对数组进行更改,则可以传递数组并对其进行更改。您传递了一个包含数组地址的指针(不需要)。如果已将数组传递给函数,则数组会衰减为指针变量。对指针变量所做的任何更改都足以保留更改。

在您的情况下,解决方案是删除calloc。这解决了这个问题。因为你没有释放内存泄漏所分配的内存。还要记住,无论何时动态分配一些内存 - 当你完成它时都要释放它。

Codewise(溶液):

...
*secondYear = firstThree[1];
*thirdYear = firstThree[2];

// PY2014 = (int*)calloc(*firstYear, sizeof(int));

for (i = 0; i < firstThree[0]; i++) {
    fscanf(fp, "%d", (PY2014 + i));
}
...

其他一些要点

打开文件时也没有错误检查。它应该是这样的

...
FILE *fp = fopen(myFile, "r");
if( fp == NULL){
    fprintf(stderr,"%s\n","Error in opening file");
    exit(1);
}
...

我不确定你是否意识到这一点,但如果你编译你的程序然后你尝试像这样运行它

./a.out input.txt
   ^        ^
   |        |
  argv[0]   argv[1]

calloc / malloc相同 - 检查他们是否返回NULL或其他内容。如果malloc返回NULL并且您尝试访问它,那么它是未定义的行为。(您的程序将崩溃说主要是seg错误)

像这样传递数组可以更容易

main()

...
readFile(argv[1], firstYear, secondYear, thirdYear, init4);

...
printf("thirdYear : %d\n", *thirdYear);

for (int i = 0; i < *firstYear; i++) {
    printf("PY2014: %d\n", init4[i]); //<-- change here.
} 

在其他功能中,您无需更改任何内容。 (除了评论calloc)。

几点

  1. 索引到数组时检查索引是否对应于数组大小范围内的正确位置。 (您没有进行任何错误检查 - *firstYear = 11时会发生什么?)

  2. 检查功能的返回值。这甚至在遇到问题之前解决了很多问题。

答案 1 :(得分:0)

整体代码非常混乱,但是导致问题的原因是您传递给readFile的变量PY2014的范围: 该函数获取一个指针,您可以更改它指向的数据但不能更改指针本身(它将在函数外部没有任何影响)。 在行PY2014 = (int*)calloc(*firstYear, sizeof(int));和for循环

for (i = 0; i < firstThree[0]; i++) {
    fscanf(fp, "%d", (PY2014 + i));
}

您正在使用PY2014作为局部变量,因此它可以在函数内部正常工作,但不在外部。