我正在编写这个C代码,它接收一个文件并从中读取值,代码还没有做任何事情,但这是我到目前为止所做的。该程序在调用四个malloc的块中崩溃。如果我注释掉y,f和yp,该程序工作正常。我不知道是什么造成的。所以任何帮助将不胜感激。
注意:我正在使用gcc在ubuntu上测试它。我确实尝试将malloc转换为“(float *)”,但我仍然得到同样的错误。
int main( int argc, char *argv[])
{
FILE *rhs, *output;
int niter, n, i = 0, j = 0, k = 0, n1 = n + 1;
rhs = fopen(argv[1], "r");
// ab+ opens file for writting and creates the file if need be
output = fopen(argv[2], "ab+");
niter = atoi(argv[3]);
// check if files open up or not, if not exit.
if((rhs == NULL) || (output == NULL))
{
printf("Error Opening files.\n");
exit(1);
}
// read in N
fscanf(rhs, "%d", &n);
// THIS IS THE BLOCK CAUSING THE CRASH
// CODE WORKS WHEN I COMMENT OUT LINES AND ONLY LEAVE ONE OF THEM IN
// generate array to hold values from rhs file
float *numbers = malloc(sizeof(float) * ((n1)*(n1)));
float *y = malloc(sizeof(float) * ((n1)*(n1)));
float *f = malloc(sizeof(float) * ((n1)*(n1)));
float *yp = malloc(sizeof(float) * ((n1)*(n1)));
// get numbers and store into array
while(fscanf(rhs, "%f", &numbers[i]) != EOF)
{
printf("In while %f\n", numbers[i]);
i++;
}
fclose(rhs);
return 0;
}
答案 0 :(得分:2)
一个问题是:
您正在使用n1
中未初始化的值初始化n
:
int niter, n, i = 0, j = 0, k = 0, n1 = n + 1;
^
+-- "n" is not initialized here, might have any value.
thus, "n1" is also not initialized to a known value.
因此,您对malloc
的调用最有可能收到太大的值,无法分配。读完“n”后初始化“n1”:
// read in N
fscanf(rhs, "%d", &n);
n1 = n + 1;
在任何情况下,都值得检查malloc()
的返回值,看看是否在无法分配内存时返回NULL。
答案 1 :(得分:1)
n1
调用时malloc()
包含垃圾。因此,您只需尝试分配大量内存。
答案 2 :(得分:0)
通过检查数字y,f,yp的值来检查内存是否已成功分配,如果它们的值为NULL,则无法分配内存。 n1的值有多大?
答案 3 :(得分:0)
这是因为n1
在您调用malloc()
时未定义。
int niter, n, i = 0, j = 0, k = 0, n1 = n + 1;
上述行未初始化n
,因此n1 = n + 1
会为n1
分配未定义的值。
您可能需要在n1 = n + 1;
之后添加fscanf(rhs, "%d", &n);
。