在c中释放指针后如何保存指针地址

时间:2018-12-03 10:27:42

标签: c pointers

我已经编写了一个代码,该代码首先创建一个内存分配并将一个字符串保存在另一个指针中。根据代码,该值必须在释放后保留在另一个地址中,但是会出现错误“ 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;
}

错了吗?

感谢您的帮助

2 个答案:

答案 0 :(得分:6)

您正在释放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分配的内存一样。

答案 1 :(得分:0)

以下是此处的陈述     免费(server_alg);

仅当您使用malloc(),calloc()或realloc()之一分配内存时,才可以使用free(),因为您还没有分配内存free(server_alg);是错误的,它将导致内存转储

,一旦对它执行free(),就永远不要尝试使用指针。