user-0 提问: 连续调用一个函数，返回指针类型数据，为什么得到的结果、地址都一样？

回复:
user: user-0
content: 引用 11 楼 自信男孩 的回复:[quote=引用 3 楼 zzlu_88888 的回复:]    [quote=引用 1 楼 自信男孩 的回复:] 注意看一下，你的Get_String函数里有free操作，既然已经释放了，那么这部分空间是可以继续被申请和使用的。所以，出现地址一样是可能的。但是有一个问题，使用已经free的内存空间会有风险，因为以释放了，可能会被别的程序使用，那么放在这里的数据就不安全了。 可是malloc要与free配对使用啊，申请了多少个，就要释放多少个。如果不及时释放，很可能发生内存泄漏。 [/quote] 那你也得使用完之后再释放嘛，只要保存好malloc的首地址，在哪里释放，什么时候释放都没关系，只要在不需要的时候手动释放就好了。[/quote]      【只要保存住首地址，用完后在哪释放都可以】这样就懂了，谢谢！

user: user-1
content: 引用 3 楼 zzlu_88888 的回复:[quote=引用 1 楼 自信男孩 的回复:] 注意看一下，你的Get_String函数里有free操作，既然已经释放了，那么这部分空间是可以继续被申请和使用的。所以，出现地址一样是可能的。但是有一个问题，使用已经free的内存空间会有风险，因为以释放了，可能会被别的程序使用，那么放在这里的数据就不安全了。 可是malloc要与free配对使用啊，申请了多少个，就要释放多少个。如果不及时释放，很可能发生内存泄漏。 [/quote] 那你也得使用完之后再释放嘛，只要保存好malloc的首地址，在哪里释放，什么时候释放都没关系，只要在不需要的时候手动释放就好了。

user: user-2
content: 正如上面几位朋友说的，在Get_String()函数中已经调用free()释放了malloc()分配的内存，所以再次调用Get_String()函数时，会再次用到这个地址（因为这个地址已经被释放了）。 而你后面修改的代码就可以了，不要在Get_String()函数中调用free()释放内存，该函数的返回值就是分配的内存空间，可以在函数外部调用free()来释放内存。

user: user-3
content: 1、malloc应该由调用者使用的释放。 2、释放后的指针要等于NULL。 3、malloc出来的空间，只是在虚拟内存中是连续的。而从实际的物理空间不一定是连续的。

user: user-4
content: 释放了还用这个指针，这不是野指针么？ 你既然要作为出参，就不应该释放，应由外部调用者释放

user: user-0
content: #include<stdio.h> #include<string.h> #include<stdlib.h> #include<stdbool.h>  #define STR_LEN (100)  int main(void) {    char ch;    int i = 0, j;    int postion = 0;    bool first_word_same = false;    char * str_buf1 = NULL;//[STR_LEN] = {0};    char * str_buf2 = NULL;// = {0};     str_buf1 = (char *)malloc(STR_LEN);       memset(str_buf1, 0, STR_LEN);    str_buf2 = (char *)malloc(STR_LEN);    memset(str_buf2, 0, STR_LEN);       if ((str_buf1 == NULL) ||(str_buf2 == NULL))     {          printf("malloc fail\n");          exit(-1);          return -1;     } 	     printf("please input string1: \n");     ch = getchar(); 	     while ((ch != '\n') && (i < STR_LEN))     {        str_buf1[i] = ch;        ch = getchar();        i++;     }      i = 0;     setbuf(stdin, NULL);  //清空输入缓冲区内容      printf("\n please input string2: \n");     ch = getchar();      while ((ch != '\n') && i < STR_LEN)     {        str_buf2[i] = ch;        ch = getchar();        i++;     }     printf("\n 2 str_buf1 add:%#X, str_buf1=%s\n",str_buf1, str_buf1);    printf("\n 3 str_buf2 add:%#X, str_buf2=%s\n",str_buf2, str_buf2);            for (i = 0; i < STR_LEN; i++)        {             if (str_buf1[i] == str_buf2[0])  //在第一个字符串中，找到与第二个字符串的首个字符相同的字符             {                 first_word_same = true;                 postion = i + 1;                  //记录此字符在第一个字符串中的位置                 printf("\n the location is : %dth \n\n", postion);             }  	    for (j = 1; first_word_same && (str_buf2[j] != '\0') ; i++, j++) //上面程序里，漏了i++ 	   {                 if(str_buf1[i+1]  != str_buf2[j]) //后续字符不同，退出第二个字符串查找，返回外面第一个字符串，继续查找                 {                     first_word_same = false;                     break;                 }                 else //上面漏加这种情况                {                     first_word_same = true;                } 	    }              if (first_word_same && (str_buf2[j] == '\0'))  //对比完第二个字符串最后一个字符后，若符合条件，则打印位置，并结束程序            {                 printf("\n The string2 location is %dth \n", postion);                   i = STR_LEN;// 让程序退出所有for循环            }			     }          free(str_buf1);         free(str_buf2);         str_buf1 = NULL;         str_buf2 = NULL;      return 0; }    经过以上修改，可以得到预期结果：  ************************************************* [root@localhost testfile]# gcc test09.c  [root@localhost testfile]# ./a.out  please input string1:  How are you?   please input string2:  are   2 str_buf1 add:0X9B88008, str_buf1=How are you?   3 str_buf2 add:0X9B88070, str_buf2=are   the location is : 5th     The string2 location is 5th  [root@localhost testfile]#  *************************************************

user: user-5
content: Get_String函数内，p已经free了，str=p，自然str的空间也不能用了

user: user-6
content: 其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。  请参考开源操作系统Linux源代码中malloc和free的具体实现。

user: user-0
content: 顺便问下， char * p = NULL; p = (char *)malloc(100); memset(p, 0, 100); 假如成功分配到首地址是 0x1000的连续100个内存单元，实际使用了50个连续的内存单元，也就是0x1000~0x1050被使用 此时执行free(p);  这时，释放的是0x1051～0x1100之间的空间是吗？  之后 ，假如执行： char * p2 = NULL; p2 = (char *)malloc(100); memset(p2, 0, 100); 此时可从0x1100开始分配连续100个内存单元使用。  这样理解，对么？

user: user-0
content: 引用 1 楼 自信男孩 的回复:注意看一下，你的Get_String函数里有free操作，既然已经释放了，那么这部分空间是可以继续被申请和使用的。所以，出现地址一样是可能的。但是有一个问题，使用已经free的内存空间会有风险，因为以释放了，可能会被别的程序使用，那么放在这里的数据就不安全了。 可是malloc要与free配对使用啊，申请了多少个，就要释放多少个。如果不及时释放，很可能发生内存泄漏。

user: user-1
content: 去掉free，再看看会不会地址一样

user: user-1
content: 注意看一下，你的Get_String函数里有free操作，既然已经释放了，那么这部分空间是可以继续被申请和使用的。所以，出现地址一样是可能的。但是有一个问题，使用已经free的内存空间会有风险，因为以释放了，可能会被别的程序使用，那么放在这里的数据就不安全了。