内存分配错误 - 在Linux但不是OSX Unix

时间:2012-02-03 07:47:54

标签: c linux memory fault

我正在为统计数据包编写一些代码,我首先将数据读入指针数组。我初始化指针并使用malloc分配足够的内存;但是,我有时会在下面的代码末尾的内存分配中出错。

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#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

这是我编写的第一个使用指针的程序,我不知道为什么它可以在一个系统上工作而不能在另一个系统上工作。

2 个答案:

答案 0 :(得分:5)

sizeof(size_t)取决于平台。在具有默认32位代码的OSX上,size_t是4个字节。在64位Linux上,size_t是8个字节。如果您在64位Linux上运行,那么您正在读取您在32位OSX上读取的其他n

如果必须使用二进制数据格式,请不要使用平台特定类型的大小作为字段大小。确定文件头是4字节还是8字节,小字节还是大字节,并一致地使用它。

请参阅: What's sizeof(size_t) on 32-bit vs the various 64-bit data models?

答案 1 :(得分:2)

在发布之前,你一定要格式化你的来源......

执行fread(&n, sizeof(size_t),1,fp);后,使用调试器或printf值n。似乎你没有得到你期望的价值。