我有以下代码,其中,我将一个内存地址返回给指针,该指针的位置用于存储字符串。 代码看起来像这样:
char* segs[1];
segs[0] = (char *) myfunction("name", 100);
//myfunction(Name,size of the memory to be allocated)
FILE *write_log;
write_log = fopen(redo_path,"a+");
函数myfunction返回一个内存位置,该位置固定为segs [0]的基址。 我的内存分配如下:
FILE *fp_seg;
fp_seg = fopen(compare,"r");
//maps from disk to mem
void *p;
p = (void *)malloc(size_to_create); //Mapping
int c;
c = fread(p,size_to_create,1,fp_seg);
我们在磁盘上打开一个文件,并生成文件中第一个位置的地址的相应映射。 (p更多地是对文件中第一个位置的引用)。
ISSUE:
使用write_log文件指针打开现有文件会破坏存储在内存位置segs [0]的字符串的内容。在调试时,我发现文件跨越的内存区域和segs [0]重叠,即
segs[0]
的内存位置为0x1cc5de0
并存储"Hello, world"
。
write_log
的内存位置为0x1cc5d50
我的猜测是在该位置打开文件会破坏seg[0]
的内容。
我如何克服这个问题?有没有办法分配内存,使区域不重叠?
修改 我的功能是这样的:
myfunction(char * compare, int size_to_create)
{
//size_to_create is the size of the memory we want to allocate to seg[0]
//Create a file with the name compare in the disk
FILE *fp_seg;
fp_seg = fopen(compare,"r");
//Read the file (File has no content as of now)
void *p;
p = (void *)malloc(size_to_create); //p has an address in main memory
int c;
c = fread(p,size_to_create,1,fp_seg);
void *t;
t=p;
//Future reads will have the same mapping
free(p);
}
答案 0 :(得分:2)
问题在于释放指针p,释放内存。
因此,系统没有限制将最初由p指向的区域分配给请求内存的代码的另一部分。