【问题标题】:how save pointer address after free the pointer in c在c中释放指针后如何保存指针地址
【发布时间】:2018-12-03 10:27:42
【问题描述】:

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

错了吗?

感谢您的帮助

【问题讨论】:

  • 不要打印带有%u的地址,您应该将它们转换为void *并使用%p
  • 为什么要两次声明test?那不会编译。
  • 为什么要保存地址?该地址的任何使用都会导致未定义的行为。

标签: c pointers dynamic-memory-allocation


【解决方案1】:

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

【讨论】:

  • @Black,你必须自己思考。 Blaze 为您提供了纠正代码所需的所有信息。
  • 我建议至少进行一项其他更改:strcpy() 可能导致缓冲区溢出。最好使用另一个函数,例如strncpy(),或者在这种情况下,strdup()。 OP 在这里并不是为了速度而故意自欺欺人。
  • 好建议,我已将其添加到帖子中。
【解决方案2】:

以下陈述是这里的问题 免费(server_alg);

只有在您使用 malloc()、calloc() 或 realloc() 之一分配内存时才能使用 free(),因为您没有分配内存 free(server_alg);错了会导致内存转储

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

【讨论】:

  • @Osiris 根据我对单个字符 'A' 的理解是正确的,如果对于字符串 "A" ,具体来说 'A' 是 char 和 "A" 字符串,在 C 中都是正确的, 基于字符串或单个字符的需要。
  • @Osiris 同意字符串和字符行为更改
  • “它会导致内存转储”,不,它会导致未定义的行为,这可能表现出来作为段错误,内存转储,崩溃或其他。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
  • 2023-03-25
  • 2022-01-18
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多