Вы освобождаете 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
.