我正在尝试编写一个包装器来从文件中获取一些预定义的标准输入。如果有#'#'该程序应跳过一行。在开头,否则将除前2个元素之外的所有元素存储在名为factorList的数组中。
我正在使用malloc动态地为这个指针分配内存。
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
int main(int argc, char * argv[])
{
int degree = 100;
int tempDegree;
int num;
int * factorList;
FILE * primeFile = fopen(argv[1],"r");
if(!primeFile)
{
printf("Could not open file containing prime table\n");
}
char store[100] = {0};
char lineCheck = ' ';
int primeCheck = fscanf(primeFile, "%s", store);
while(primeCheck != EOF)
{
if(strcmp("#",store) == 0)
{
printf("Mark1\n");
// Clearing Store array
memset(store, 0 , sizeof(store));
// Skip this line
while((lineCheck != '\n') && (primeCheck != EOF))
{
primeCheck = fscanf(primeFile, "%c", &lineCheck);
}
lineCheck = ' ';
// Reading the start of the next line
if(primeCheck != EOF)
{
primeCheck = fscanf(primeFile, "%s", store);
}
}
else
{
tempDegree = atoi(store);
if(tempDegree == degree)
{
printf("Mark2\n");
// This is the list of primes
primeCheck = fscanf(primeFile, "%d", &num);
factorList = malloc(sizeof(int)*num);
int i;
for(i=0;i < num; i++)
{
primeCheck = fscanf(primeFile, "%d", &factorList[i]);
printf("%d",factorList[i]);
}
break;
}
else
{
printf("Mark3\n");
// Clearing Store array
memset(store, 0 , sizeof(store));
// Skip this line
while((lineCheck != '\n') && (primeCheck != EOF))
{
primeCheck = fscanf(primeFile, "%c", &lineCheck);
}
lineCheck = ' ';
// Reading the start of the next line
if(primeCheck != EOF)
{
primeCheck = fscanf(primeFile, "%s", store);
}
}
}
// Testing Access to factorList , getting error here.
int i = factorList[0];
}
return 0;
}
答案 0 :(得分:1)
该行:
// Testing Access to factorList , getting error here.
int i = factorList[0];
不在while循环之外。它位于循环的底部,因此每次迭代循环都会执行一次。
循环内部是一个分支。如果读取仅包含单个“#”的行,则分支的“true”部分不会向factorList分配任何内容。因此,如果在循环的第一次迭代期间遇到'#',程序可能会崩溃,因为您正在取消引用一个没有赋值的指针,从而调用未定义的行为。
在假分支内,还有另一个分支。该分支的错误部分也没有为factorList分配任何内容,因此如果第一次迭代时tempDegree == degree不为真,则会发生同样的事情。
还有很多其他方面需要改进,我会密切关注你问题的一些评论。