我正在尝试获取一个值列表,以便在运行此代码时进行更新,但我的目的就在于结束。在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()中调用循环时它只是零。
感谢您的帮助!
答案 0 :(得分:0)
问题是你传递一个指针,然后你分配内存并将它的地址分配给传递的指针。然后范围结束,并且对被调用函数中的本地指针变量所做的更改将丢失。您尝试在main()
中打印一些未初始化的值。在你的情况下,它结果是零。(垃圾值)。
如果您打算对数组进行更改,则可以传递数组并对其进行更改。您传递了一个包含数组地址的指针(不需要)。如果已将数组传递给函数,则数组会衰减为指针变量。对指针变量所做的任何更改都足以保留更改。
在您的情况下,解决方案是删除calloc
。这解决了这个问题。因为你没有释放内存泄漏所分配的内存。还要记住,无论何时动态分配一些内存 - 当你完成它时都要释放它。
...
*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
)。
索引到数组时检查索引是否对应于数组大小范围内的正确位置。 (您没有进行任何错误检查 - *firstYear = 11
时会发生什么?)
检查功能的返回值。这甚至在遇到问题之前解决了很多问题。
答案 1 :(得分:0)
整体代码非常混乱,但是导致问题的原因是您传递给readFile的变量PY2014
的范围:
该函数获取一个指针,您可以更改它指向的数据但不能更改指针本身(它将在函数外部没有任何影响)。
在行PY2014 = (int*)calloc(*firstYear, sizeof(int));
和for循环
for (i = 0; i < firstThree[0]; i++) {
fscanf(fp, "%d", (PY2014 + i));
}
您正在使用PY2014
作为局部变量,因此它可以在函数内部正常工作,但不在外部。