2017-01-29 53 views
0

Я нахожу ответы, но все они работают только на Linux. Но как насчет MacOS? Мой код в порядке на ubuntu, поэтому мне не нужно вставлять их. Спасибо! -------------------------------------------- Редактируйте и вставьте мой код.Ошибка «не может выделить память» при использовании mmap() в OSX 10.12

void unix_error(char* msg) 
{ 
    fprintf(stderr, "%s: %s\n", msg, strerror(errno)); 
    exit(0); 
} 
void* Mmap(void* start, size_t length, int prot, int flags, int fd, off_t offset) 
{ 
    void* ptr; 
    if((ptr = mmap(start, length, prot, flags , fd, offset)) == ((void*)-1)){ 
     unix_error("mmap"); 
    } 
    return ptr; 
} 

int main 
{ 
    char *homepath = getenv("HOME"); 
    char *file = "/Desktop/main.c"; 
    strcat(homepath, file); 
    printf("%s\n", homepath); 
    int fd = open_file(homepath); 
    printf("%d\n", fd); 
    char *ptr = Mmap(NULL, filesize, PROT_READ, MAP_PRIVATE, fd, 0); 
    write(1, ptr, filesize); 
} 

ошибка прибудете:

/Users/<username>/Desktop/main.c 
3 
mmap: Cannot allocate memory 
+1

Пожалуйста, покажите свой код, чтобы мы могли видеть, что вы пытаетесь сделать. – STLDeveloper

+0

код добавлен. @ STLDeveloper – wind2412

+0

Это, очевидно, не код, который сообщает madethis. Пожалуйста, покажите нам весь код, необходимый для повторения вашей проблемы. – fuz

ответ

0

getenv() функция обычно возвращает указатель на память вы не можете/не следует изменять. И это, безусловно, не возвращает один с кучей дополнительного места в конце, к которому вы можете добавить.

Таким образом, ваш strcat(homepath, file) попирает память, и это не должно произойти после этого. Он может (как представляется,) работать правильно, он может выйти из строя сразу или значительно позже, или даже может вытеснить монахи из вашего выхлопного порта.