我在使用 malloc 时遇到了分段错误,我不确定是什么原因造成的(C 新手)打赌这是我错过的愚蠢的东西。
段错误发生在"printf("test")之前的行上;
编辑:要么我很困惑...或者它决定在打印段错误时进行更改,因为在我遵循建议的更改之一之后......它决定工作(该更改是在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("%dnn", *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("testn");
for(; fscanf(fp, "%d", *oneGrade) == 1 && !feof(fp); oneGrade++);
return oneGrade;
}
感谢您的任何帮助
编辑:我正在使用指针进行numItem,因为...按照赋值的规定,我必须能够在 main 中(以指定的方式)访问该值......我不能只是把它贴在一个年级的末尾并以这种方式返回:|
这是一个问题:
fscanf(fp, "%d", *oneGrade)
oneGrade
是一个int *
.因此,*oneGrade
此时是一个随机值,更不用说不打算成为地址了。你可能想要fscanf(fp, "%d", oneGrade)
. fscanf
需要指向要将值读入的位置的指针。
您还需要检查以确保*numItem
在malloc
之前大于零oneGrade
。
一个有用的建议,在取消引用指针之前,请始终检查指针:
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++);
你会得到段错误。