[英]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.