繁体   English   中英

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

[英]how save pointer address after free the pointer in c

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

这是错的吗?

感谢您的帮助

您正在释放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);释放它free(test); ,就像malloc分配的malloc

以下语句是这里的问题free(server_alg);

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM