我正在为统计软件包编写一些代码,并开始通过读取数据到指针数组。我初始化指针并使用malloc分配足够的内存;但是,我有时会在下面的代码末尾处分配内存错误。内存分配错误 - 在Linux中但不是OSX Unix
#include
#include
#include
#include "stats.h"
int main(int argc, char **argv) {
FILE *fp, *outFile, *outBin; // create a file identifier
size_t n, nbins; // # of data points
double *data; // pointer to hold data
double average, variance, *med; // stat returns
int medianComplete, histComplete, i; // return 1 on success
hist_t *Histogram;
// read in the number of bins from exe arguments
nbins = atoi(argv[1]);
nbins = (size_t)nbins;
// open the binary datafile and read in first value
// which is number of data points
// use exe input for filename
fp = fopen(argv[2],"rb");
fread(&n, sizeof(size_t),1,fp);
// allocate enough memory to hold all data
data = (double*)malloc(sizeof(double)*n);
if (!data)
printf("Memory allocation error");
fread(data,sizeof(double),n,fp);
这个程序编译和运行以及我的个人机(MacOSX的),但未能由于分段错误,当我试图在Linux服务器上运行它。我使用Valgrind来查看是否可以找出错误,并收到以下结果。
==8641== Warning: silly arg (-501426814648844128) to malloc()
==8641== Invalid write of size 1
==8641== at 0x4C2B20D: mempcpy (mc_replace_strmem.c:956)
==8641== by 0x4EA2F15: _IO_file_xsgetn (fileops.c:1423)
==8641== by 0x4E971D2: fread (iofread.c:44)
==8641== by 0x40086D: main (runstats.c:28)
==8641== Address 0x0 is not stack'd, malloc'd or (recently) free'd
这是我曾经写过一个使用指针的第一个程序,我茫然为什么它会在一个系统上工作,而不是其他。
2012-02-03
dwv5009
+0
加在文件指针的测试和fopen()函数是成功的。 Valgrind表示当我将内存分配给数据时发生错误。我在数据上执行的检查在服务器上失败,但通过我自己的计算机。 –
2012-02-03 08:29:36
+0
当我看到这个问题时,首先看到的是:“为什么他在C语言中做这个时,有几十种更合适的语言?” –
2012-02-03 08:35:31