【发布时间】:2012-02-03 07:47:54
【问题描述】:
我正在为一个统计包编写一些代码,我首先将数据读入一个指针数组。我使用 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
这是我编写的第一个使用指针的程序,我不知道为什么它可以在一个系统上运行,而在另一个系统上不行。
【问题讨论】:
-
在文件指针的测试中添加,fopen()成功。 Valgrind 表示当我为数据分配内存时发生错误。我对数据执行的检查在服务器上失败,但在我自己的计算机上通过。
-
当我看到这个问题时,首先想到的是:“当有几十种更合适的语言时,他为什么要在 C 中这样做?..”