我已经编写了一个代码,该代码首先创建一个内存分配并将一个字符串保存在另一个指针中。根据代码,该值必须在释放后保留在另一个地址中,但是会出现错误“ 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;
}
错了吗?
感谢您的帮助
答案 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(),就永远不要尝试使用指针。