使用Malloc时的Segfault

时间:2014-02-28 03:57:47

标签: malloc

我在使用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结束并以这种方式返回:|

2 个答案:

答案 0 :(得分:0)

这是一个问题:

fscanf(fp, "%d", *oneGrade)

oneGradeint *。所以此时*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 bytesmalloc不会返回任何有效地址,

int *oneGrade = malloc(sizeof(int) * (*numItem));

oneGrade不会指向任何有效地址,当您解除它时,

for(; fscanf(fp, "%d", *oneGrade) == 1 &&  !feof(fp); oneGrade++); 

你得到了段错误。