gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:33:02 24 4
gpt4 key购买 nike

我写了一段代码,它首先创建一个内存分配并将一个字符串保存在另一个指针中。根据代码,该值必须在 free 后保存在其他地址中,但它给出错误“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); 来释放它,就像 malloc 分配的内存一样。

关于c - c中释放指针后如何保存指针地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53591805/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com