Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
dlmalloc';s mspace_malloc返回奇怪的地址_C_Malloc_Systems Programming - Fatal编程技术网

dlmalloc';s mspace_malloc返回奇怪的地址

dlmalloc';s mspace_malloc返回奇怪的地址,c,malloc,systems-programming,C,Malloc,Systems Programming,[我已经解决了这个问题--请参阅下面我最后的评论。] 在我的应用程序中,我需要基于Doug Lea的dlmalloc使用我自己的特殊malloc:我映射一个匿名文件(使用mmap),从映射文件的一部分创建一个mspace,并将mspace传递给mspace_malloc。我发现mspace_malloc返回的一些地址不在映射文件的范围内——尽管,据我所知,进程可以很好地写入和读取malloc的内存。为什么我会遇到这种行为,我该怎么做才能强制mspace_malloc返回mspace范围内的地址

[我已经解决了这个问题--请参阅下面我最后的评论。]

在我的应用程序中,我需要基于Doug Lea的dlmalloc使用我自己的特殊malloc:我映射一个匿名文件(使用mmap),从映射文件的一部分创建一个mspace,并将mspace传递给mspace_malloc。我发现mspace_malloc返回的一些地址不在映射文件的范围内——尽管,据我所知,进程可以很好地写入和读取malloc的内存。为什么我会遇到这种行为,我该怎么做才能强制mspace_malloc返回mspace范围内的地址

/* Inside dl_malloc.c */

#define ONLY_MSPACES 1
#define MSPACES 1

void * heap;
off_t heap_length;
mspace ms;

void init(size_t size) {
  heap = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
  if (heap == MAP_FAILED) {
    perror("init: mmap");
    exit(EXIT_FAILURE);
  }
  heap_length = size;
  ms = create_mspace(heap, size, 0);
  mspace_track_large_chunks(ms, 1);
}

void * my_malloc(size_t bytes) {
  return mspace_malloc(heap, bytes);
}
/************************/


/* In application */
#include <stdio.h>
#include <stdlib.h>
#define HEAP_SIZE 0x10000  // 32 pages
#define ROWS 2
#define COLS 4096

extern void init(void);
extern void * my_malloc(size_t bytes);

extern void * heap;
extern off_t heap_length;

int main(void) {
  init(HEAP_SIZE);
  int ** matrix = (int **)my_malloc(sizeof(int *) * ROWS);
  int i;
  for (i = 0; i < ROWS; ++i)
    matrix[i] = (int *)my_malloc(sizeof(int) * COLS);

  printf("Heap bounds: %lx to %lx\n",
    (off_t)heap, (off_t)heap + heap_length);
  printf("Matrix: %p  ", matrix;
  for (i = 0; i < ROWS; ++i)
    printf("Matrix[%d]: %p  ", i, matrix[i]");
  printf("\n");

  return EXIT_SUCCESS;
}
dl_malloc.c内的
/**/
#仅定义_MSPACES 1
#定义MSPACES 1
空*堆;
离堆长度;
mspace-ms;
void init(大小\u t大小){
heap=mmap(NULL,size,PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_ANONYMOUS,-1,0);
if(heap==MAP\u失败){
perror(“初始:mmap”);
退出(退出失败);
}
堆长度=大小;
ms=create_mspace(堆,大小,0);
mspace\u track\u大块(ms,1);
}
void*my\u malloc(大小\u t字节){
返回mspace_malloc(堆,字节);
}
/************************/
/*应用中*/
#包括
#包括
#定义堆大小0x10000//32页
#定义第2行
#定义COLS 4096
外部无效初始(无效);
extern void*我的malloc(大小为字节);
外部无效*堆;
外部关闭堆长度;
内部主(空){
init(堆大小);
int**matrix=(int**)my_malloc(sizeof(int*)*行);
int i;
对于(i=0;i
当我运行这个程序时(好吧,上面是一个简化,但不是很多),我看到分配给矩阵的地址在堆的打印范围内,但两行的两个地址远远低于下限——低于下限超过0x100000000!但我似乎能够读取和写入矩阵。最后一点我感到困惑并想理解,但更紧迫的问题是我需要做一些事情来确保我的_malloc返回的所有地址都在堆边界内,因为我的应用程序的其他部分需要这样做

顺便说一句,请注意,我不需要锁定我的调用来创建_mspace,因为我在这个程序中只使用了一个线程。无论如何,我尝试将这个参数设置为1,但结果没有什么不同


谢谢!

Eureka(哈哈哈)!上面的简化示例和给定的常量将正常工作,返回的地址将在范围内。但是,如果您在相对于原始mspace太大的大小上调用my_malloc,malloc将调用mmap(除非您明确禁用此功能)。我看到的地址仅仅是那些调用mmap后返回的地址。因此,这个谜团的解决方案非常简单。我将发布此消息,以防其他人碰巧遇到此问题并忘记malloc对mmap的调用。

您的
main
函数不会调用
my_malloc()
没问题。只是一个输入错误:s/malloc/my_malloc/(请)。谢谢。我们已经更正了帖子。问题本身仍然存在。