我在使用malloc时遇到了分段错误,我不确定是什么导致了它(对C来说是新手),认为这是一种我不知道的愚蠢行为。
段错误发生在“printf(”test \ n“);
之前的行上 编辑:要么我感到困惑......或者它决定在打印段错误时改变,因为在我按照建议的更改之后...它决定工作(那个改变是在printf之后(“测试”)谢谢你们的帮助据我所知,它应该可以将sizeof(int)乘以numitem指向的值
但是,段错误意味着它无法访问存储在那里的数据......
编辑:添加了我的其余代码:
#include <stdio.h>
#include <stdlib.h>
int * readIntFile(char[], int*);
int main(){
char fileName[255];
int *grades;
int *numItems = malloc(sizeof(int));
printf("Please input the file name you would like to open:");
scanf("%s", fileName);
printf("the input string is \"%s\"\n ", fileName);
grades = readIntFile(fileName, (int*) numItems);
printf("%d\n\n", *grades); //I know this line only prints the first index, it's
//for testing
}
int * readIntFile( char fileName[], int *numItem ){
FILE *fp;
int holder;
*numItem = 0;
fp = fopen(fileName, "r");//open file to to read
while( fscanf(fp, "%d", &holder) == 1 && !feof(fp))
(*numItem)++;
rewind(fp);
int *oneGrade = malloc(sizeof(int) * (*numItem));
printf("test\n");
for(; fscanf(fp, "%d", *oneGrade) == 1 && !feof(fp); oneGrade++);
return oneGrade;
}
感谢您的帮助
编辑:我正在使用numItem的指针,因为...正如赋值所指定的那样我必须能够以main(以指定的方式)访问该值...我不能只是坚持它oneGrade结束并以这种方式返回:|
答案 0 :(得分:0)
这是一个问题:
fscanf(fp, "%d", *oneGrade)
oneGrade
是int *
。所以此时*oneGrade
是一个随机值,更不用说不是一个地址了。你可能想要fscanf(fp, "%d", oneGrade)
。 fscanf
需要指向您想要读取值的位置的指针。
您还需要检查以确保在*numItem
的{{1}}之前malloc
大于零。
答案 1 :(得分:0)
一个有用的建议,在解除引用之前总是检查指针:
if(oneGrade !=NULL)
现在,你的错误:
如果numItem
在以下后仍然为0,则
while( fscanf(fp, "%d", &holder) == 1 && !feof(fp))
(*numItem)++;
这意味着,malloc
0 bytes
和malloc
不会返回任何有效地址,
int *oneGrade = malloc(sizeof(int) * (*numItem));
oneGrade
不会指向任何有效地址,当您解除它时,
for(; fscanf(fp, "%d", *oneGrade) == 1 && !feof(fp); oneGrade++);
你得到了段错误。