как сохранить адрес указателя после освобождения указателя в c - PullRequest
0 голосов
/ 03 декабря 2018

Я написал код, который сначала создает выделение памяти и сохраняет строку в другом указателе.Согласно коду, значение должно быть сохранено в другом адресе после освобождения, но оно выдает ошибку «munmap_chunk (): неверный указатель».

Мой код:

#include <stdio.h>
#include <stdlib.h>
#include "testfunc.h"
#include <string.h>

int main()
{
static char *server_alg;
char *test;
char *test = (char*) malloc(30*sizeof(char));
server_alg = "A";
strcpy(test, server_alg);
printf("server_alg addr = %u \n", &*server_alg);
printf("server_alg value = %u \n", server_alg);
printf("SERVER_ALGO addr = %d \n", *server_alg);
free(server_alg);
server_alg=NULL;
printf("           nulled          \n");
printf("server_alg addr = %u \n", &*server_alg);
printf("server_alg value = %u \n", server_alg);
printf("SERVER_ALGO addr = %u \n", test);
printf("SERVER_ALGO value = %u \n", *test);
return 0;
}

Isэто неправильно?

Спасибо за помощь

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

следующие операторы - это проблемы здесь free (server_alg);

вы можете использовать free () только тогда, когда вы выделяете память с использованием одного из malloc (), calloc () или realloc (), как вы этого не делаливыделенная память свободна (server_alg);неправильно, это приведет к дампу памяти

, и мы никогда не должны пытаться использовать указатель, как только мы сделаем для него free ().

0 голосов
/ 03 декабря 2018

Вы освобождаете server_alg, но вы не выделяете там никакой памяти.Вместо этого вы присвоили ему строковый литерал, поэтому он указывает на место только для чтения в двоичном файле вашей программы:

server_alg = "A";

После этого вы копируете этот указатель в test:

strcpy(test, server_alg);

Это правильно, поскольку вы правильно распределили память для test здесь:

char *test = (char*) malloc(30*sizeof(char));

Затем, однако, вы пытаетесь освободить ее, пока она еще указывает на "A" в вашем двоичном файле.:

free(server_alg);

Вместо этого попробуйте освободить test, поскольку это указывает на выделенную вами память:

free(test);
test=NULL;

Кроме того, здесь есть проблема с переопределением:

char *test;
char *test = (char*) malloc(30*sizeof(char));

Вы определяете test дважды, лучше просто удалите эту первую строку.

И последнее, но не менее важное, я бы изменил отпечатки в конце на:

printf("server_alg addr = %p \n", server_alg);    // 00D87B30 (or something similar)
printf("server_alg value = %s \n", server_alg);   // A
printf("SERVER_ALGO addr = %p \n", test);         // 00000000
//printf("SERVER_ALGO value = %u \n", *test);

%s - это спецификатор, который позволяет печатать строку, а %p - это указатель.Я прокомментировал эту последнюю печать, потому что она вылетит из программы, поскольку test будет освобожден и теперь будет иметь нулевой указатель, поэтому мы не можем получить доступ к его содержимому.

В другой заметке, когда вы хотите скопироватьстрока в кучу (будь то строковый литерал или другое место в куче стека), strdup может быть использовано для этого.Он выделяет соответствующий объем памяти, поэтому вам не нужно об этом беспокоиться.Назовите это так:

char *test = strdup("A");

Когда вы закончите с этим, вы освободите его, вызвав free(test);, точно так же, как с памятью, выделенной malloc.

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