c - 如何使用此 malloc 语句分配内存?

标签 c memory malloc allocation

我有这个读取文件的方法。一个更具体的矩阵,其中前两个数字是行和列。但是,当我尝试使用 malloc 分配内存并使用行和列时,应用程序崩溃。

我使用的代码是这个:

#include stdio.h
#include stdlib.h
#include stdlib.h

float * readFile(char* nombre, int*renglones, int*columnas){
FILE *fp;
fp=fopen(nombre,"r");

fscanf(fp,"%d",&renglones);

printf("el numero de renglones es %d\n",renglones);

fscanf(fp,"%d",&columnas);

printf("number of rows %d\n",columnas);
float value;

fscanf(fp,"%f",&value);
printf("el numero de columnas es %f\n",value);
fscanf(fp,"%f",&value);
printf("el numero de columnas es %f\n",value);
printf("no llegue a malloc");
float * res = malloc(*renglones**columnas*sizeof(float)); //memory reservation and the line that breaks the program 
printf("after malloc");



fclose(fp);
return 0;

}

我知道包含在 <>

之间

最终代码是包含:stdio.h 和 stdlib.h 的代码

  float * readFile(char* nombre, int*renglones, int*columnas){
FILE *fp;
fp=fopen(nombre,"r");
fscanf(fp,"%d",renglones);
printf("el numero de renglones es %d\n",renglones);
fscanf(fp,"%d",columnas);
printf("el numero de columnas es %d\n",columnas);
float value;
float * res = (float*)malloc(*renglones**columnas*sizeof(float)); //Reserva de memoria
printf("llegue a malloc\n");
int i;
for(i=0;i<*renglones**columnas;i++){
        fscanf(fp, "%f",&value);
        res[i]=value;
        printf("dato %f\n",value);
}
printf("%d",i);
fclose(fp);
return res;

}

谢谢!

最佳答案

你的问题是你做了:

...
fscanf(fp,"%d",&renglones);
...
fscanf(fp,"%d",&columnas);
...

因此,这 2 个数字(您从文件中读取的)成为指向 renglonescolumnas 的指针,您进一步取消引用以计算 malloc 的大小。例如,如果您读取数字 1632,则 renglones 指向 0x00000010columnas 指向 0x00000020。然而,这些内存单元显然包含随机垃圾(从您的任务的角度来看),即它们可能包含任意巨大的数字,当它们相乘时会得到更大的数字,而 malloc 根本无法分配那么多内存量,最终导致崩溃。

应该是:

...
fscanf(fp,"%d",renglones);
...
fscanf(fp,"%d",columnas);
...

因为 renglonescolumnas 都已经是指针了。这样您就可以真正填充 renglonescolumnas 指向的两个 int 变量,并获得预期的行为。

关于c - 如何使用此 malloc 语句分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16492457/

相关文章:

c++ - 如何使用 GCC 配置 Mono Include Directory 路径

c - 初始化二维数组时出现段错误

c - 在C中使用输入的复杂性(观点?)

caching - Flutter 缓存管理器库

performance - OpenCV 中就地 RGB->BGR 颜色转换较慢

设置值时出现 C++ 访问冲突错误

c - 用于模块化 C 应用程序的资源

java - 从 HashMap 中删除未使用的分配内存

c - 释放 malloc 的结构数组时出错

c - 包装 malloc 但仅适用于某些输入文件(对象和 lib)