簡體   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