Как выделить память вручную - PullRequest
2 голосов
/ 20 октября 2019

Когда я изучал указатель, у меня была идея получить лучшее представление о распределении памяти, поэтому я попытался выделить память указателю вручную, но это не сработало. Может кто-нибудь объяснить больше об этом? Я ничего не нашел.

Я написал некоторый код на C, этот код выделяет указатель и печатает позиции

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char *test;
    test = malloc(sizeof(char*));
    test[0] = 't';
    test[1] = 'e';
    test[2] = 's';
    test[3] = 't';
    test[4] = ' ';
    test[5] = ' ';
    test[6] = ' ';
    test[7] = ' ';
    printf("%p\n",test);
    printf("%p\n",test[0]);
    printf("%p\n",test[1]);
    printf("%p\n",test[2]);
    printf("%p\n",test[3]);
    printf("%p\n",test[4]);
    printf("%p\n",test[5]);
    printf("%p\n",test[6]);
    printf("%p\n",test[7]);
}

, когда я выполняю его, выводом является эта и только первая строкаизменяется при выполнении

0x561160
0x74
0x65
0x73
0x74
0x20
0x20
0x20
0x20

Так что напишите это другое

#include <stdio.h>
#include <stdlib.h>
int main()
{
        char *memory;
        memory = malloc(1);
//        memory = 0x561160;
        memory[0] = 0x74;
        memory[1] = 0x65;
        memory[2] = 0x73;
        memory[3] = 0x74;
        memory[4] = 0x72;
        memory[5] = 0x20;
        memory[6] = 0x20;
        memory[7] = 0x20;
        printf("%s",memory);
}

, если я выделю память, программа получит вывод 'test' (все в порядке)

Но если я использую закомментированную позицию в памяти (которую я получаю из другой программы), программа вылетает, кто-то может сказать мне, почему программа вылетает, если я не освободил другой указатель?

1 Ответ

1 голос
/ 20 октября 2019

Когда вы запускаете программу ( процесс ) в современной операционной системе, она получает свое собственное адресное пространство. Это адресное пространство существует в течение всего процесса, но оно очищается после завершения процесса. Кроме того, адресные пространства разных процессов полностью изолированы друг от друга.

При этом вы не можете просто взять указатель, напечатанный программой, а затем просто использовать его в другом процессе.

Подробнее здесь: https://en.wikipedia.org/wiki/Process_management_(computing)

Отдельная проблема заключается в том, что ни один из ваших двух примеров не выделяет достаточно памяти для memory.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...