我是C语言的新手,我正在尝试使用Malloc动态分配内存,然后使用“ free”释放内存。
我已经尝试过在Google上进行搜索,但自从我刚开始学习它以来,到目前为止还没有任何意义。
#include <stdio.h>
#include <stdlib.h>
int main (){
printf("Enter your name:");
//Here I allocate enough memory for the "sir" array.
//allocate memory
char *sir = (char*) malloc (100 * sizeof(char));
//scan string. I am scanning a name e.g.: John Smith
scanf("%[^\n]", sir);
//size of sir
int size = strlen(sir);
printf("String size with strlen = %d\n", size);
//printing the string
for(int i = 0; i < size; i++){
printf(" %d = [%c] ", i ,sir[i]);
}
//Printing J o h n _ S m i t h
//Here I release the memory allocated
//release memory
free(sir);
//print the string after releasing memory
printf("\n\n");
for(int i = 0; i < size; i++){
printf(" %d = [%c] ", i ,sir[i]);
}
//Printing _ _ _ _ _ S m i t h
//After the above loop, I still have some input as well as some memory which I can access.
// I do not understand why free does not release whole memory.
return 0;
}
我期望在free(sir)行之后,我尝试访问的内存为空/不可访问。
我明白这是错的吗?
谢谢。
答案 0 :(得分:0)
这是预期的 undefined 行为。调用free
之后,您的指针仍将指向相同的地址。现在,对malloc
的另一个调用可以使用已释放的内存,否则将保留该内存。但是,如果没有任何内容写入该地址,则其内容将保持不变,并且由于指针仍指向该地址,因此可以打印该字符串。通常,free
用于内存管理,而不是用于将内存设置为任何值。
永远不要在实际代码中这样做,免费使用后会带来巨大的安全风险。
edit:为澄清起见,即使没有写入任何内容,您也可能根本无法访问该内存。同样,没有办法事先知道。