【发布时间】:2020-06-26 12:32:47
【问题描述】:
我使用以下函数从文本文件中读取双精度值,然后将其转换为浮点数组,但最终在程序运行期间意外终止。谁能告诉我这里出了什么问题。
float *readFile_double_to_float(char *fileName, int fileSize)
{
double *array = (double *)malloc(fileSize * sizeof(double *));
float *array_float = (float *)malloc(fileSize * sizeof(float *));
FILE *fp = fopen(fileName, "r");
if (fp == NULL)
{
printf("Error: Cannot open file for reading ===> %s\n", fileName);
exit(1);
};
for (int i = 0; i < fileSize; i++)
{
fscanf(fp, "%lf", array + i);
};
fclose(fp);
for (int i = 0; i < fileSize; i++)
{
array_float[i] = (float)array[i];
};
printf("CHECK VAL DOUBLE TO FLOAT : float: %.20f | double: %.20f\n", array_float[0], array[0]);
printf("FILE READ COMPLETED ===> %s\n", fileName);
free(array);
return array_float;
}
【问题讨论】:
-
sizeof(double *)是指向double的指针 的大小,而不是double值。例如在32 位平台sizeof(double)通常大于 比sizeof(double *),这意味着您不会分配足够的内存。 -
为什么是临时的
double数组?为什么不直接读入float数组呢? -
为什么要选角?除非你需要,否则不要施放。
-
关于:
double *array = (double *)malloc(fileSize * sizeof(double *));和float *array_float = (float *)malloc(fileSize * sizeof(float *));1) 分配double或floatNOTdouble *或float *2) 返回的类型是void*可以分配给任何指针,铸造只会使代码混乱并且容易出错。 3) 始终检查 (!=NULL) 返回值以确保操作成功。如果不成功 (==NULL) 则调用perror( "malloc failed" );以便通知用户该问题。
标签: c floating-point