二级指针
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
int a = 10;
int *p = &a;
int **pp = &p;
printf("&a : %p\n", &a);
printf("p : %p\n", p);
printf("&p: %p\n", &p);
printf("pp: %p\n", pp);
printf("&pp: %p\n", &pp);
printf("*p: %d\n", *p);
printf("*pp:%p\n", *pp);
printf("**pp:%d\n", **pp);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//二级指针作为输出参数
//在函数内部 在堆上开辟空间 传出去。
int get_mem(/*out */char **mem1, int *mem_len1, char **mem2, int *mem_len2)
{
char *temp_p1 = NULL;
char *temp_p2 = NULL;
int len1 = 0;
int len2 = 0;
if (mem1 == NULL || mem2 == NULL || mem_len1 == NULL || mem_len2 == NULL) {
fprintf(stderr, " (mem1 == NULL || mem2 == NULL || mem_len1 == NULL || mem_len2 == NULL) \n");
return -1;
}
temp_p1 = (char *)malloc(4096);
if (temp_p1 == NULL) {
return -1;
}
memset(temp_p1, 0, 4096);
strcpy(temp_p1, "12345678");
len1 = strlen(temp_p1);
temp_p2 = (char*)malloc(4096);
if (temp_p2 == NULL) {
return -1;
}
memset(temp_p2, 0, 4096);
strcpy(temp_p2, "abcdefg");
len2 = strlen(temp_p2);
//以上开辟完空间
*mem1 = temp_p1;
*mem2 = temp_p2;
*mem_len1 = len1;
*mem_len2 = len2;
return 0;
}
void free_mem(char **mem1, char **mem2)
{
char *temp_mem1 = *mem1;
char *temp_mem2 = *mem2;
if (mem1 != NULL) {
free(temp_mem1);
}
if (mem2 != NULL) {
free(temp_mem2);
}
*mem1 = NULL;
*mem2 = NULL;
}
int envalue(char** myStr1, char** myStr2, char** myStr3)
{
char* temp1 = (char*)malloc(200);
strcpy(temp1, "燕子来时新社,梨花落后清明。池上碧苔三四点,叶底黄鹂一两声。");
*myStr1 = temp1;
//char* temp2 = (char*)malloc(sizeof(char) * 100);
char* temp2 = (char*)malloc(200);
memset(temp2, 0, 200);
char* temp3 = "巧笑东邻女伴,采桑径里逢迎。疑怪昨宵春梦好,元是今朝斗草赢。笑从双脸生。";
strcpy(temp2, "巧笑东邻女伴,采桑径里逢迎。疑怪昨宵春梦好,元是今朝斗草赢。笑从双脸生。");
*myStr2 = temp2;
*myStr3 = "hello Yanshu"; //变量和空间都 在静态区最后系统回收
return 0;
}
void free_envalue(char** mystr1)
{
if (mystr1 == NULL)
{
return;
}
//delete *mystr1;
free(*mystr1);
*mystr1 = NULL;
//char* tem = NULL;
//if (mystr1 == NULL)
//{
// return;
//}
//tem = *mystr1;
//free(tem);
//*mystr1 = NULL;
return;
}
//在被调用函数中把p1所指向的内存释放掉,但是实参p1不能被修改成NULL,有野指针现象
void free_envalue1(char* mystr1)
{
if (mystr1 == NULL)
{
return;
}
delete mystr1;
mystr1 = NULL;
return;
}
void free_envalue2(char** mystr1)
{
//*mystr1表示什么呢?
if (*mystr1 == NULL)
{
return;
}
//delete *mystr1;
free(*mystr1);
*mystr1 = NULL;
//char* tem = NULL;
//if (mystr1 == NULL)
//{
// return;
//}
//tem = *mystr1;
//free(tem);
//*mystr1 = NULL;
return;
}
int main(void)
{
char *buf1 = NULL;
char *buf2 = NULL;
int len1 = 0;
int len2 = 0;
if (get_mem(&buf1, &len1, &buf2, &len2) < 0) {
return -1;
}
printf("buf1: %s, buf2:%s\n", buf1, buf2);
free_mem(&buf1, &buf2);
char *pome1 = NULL;
char *pome2 = NULL;
char *pome3 = NULL;
envalue(&pome1, &pome2, &pome3);
printf("%s\n", pome1);
printf("%s\n", pome2);
printf("%s\n", pome3);
free_envalue(&pome1);
//free_envalue1(pome1);p1不能被修改成NULL,有野指针现象, thus free room will be wrong!
free_envalue2(&pome2);
//begin free room
if (pome1 != NULL)
{
free(pome1);
pome1 = NULL;
}
if (pome2 != NULL)
{
free(pome2);
pome2 = NULL;
}
//end free room
system("pause");
return 0;
}
不知为什么用malloc时没错,但用new 分配空间后释放空间就出错了。

3753

被折叠的 条评论
为什么被折叠?



