none
这样截取字符串的方法可取么?相关内存怎么释放?有更好方法么? RRS feed

  • 问题

  • #include <stdio.h>
    
    #include <stdlib.h>
    
    #include <string.h>
    
    char*  fun(const char* p,int start,int length);
    
    int main(int argc, char *argv[])
    
    {
    
      const char *str_old="abcdefg";
    
      char *str=fun(str_old,2,2);
    
      printf("%s\n",str);
    
      system("PAUSE");    
    
      return 0;
    
    }
    
    char*  fun(const char* p,int start,int length)
    
    {
    
    char *str=(char*)malloc((length+1)*sizeof(char));
    
    strcpy(str,p+start-1);
    
    str[length]='\0';
    
    return str;
    
    }
    
    
    如果free(str);可以么
    释放到'\0‘停止还是?  这个函数怎么知道释放多少字节?
    main 中的 str并不是malloc分配的 只是和fun中的str 所存猪的起始地址一样

    还是说fun中的所有变量自动释放了?
    • 已编辑 luyi0619 2009年8月9日 5:18
    2009年8月9日 5:18

答案

  • free(str)是可以的,free(str)是释放完str所指向的通过malloc申请的所有内存.在malloc时,系统会有一个数据块来纪录这一片被分配的内存.当free时系统会从这个块中获取信息并正确释放掉这些内存.
    str所指向的内存地址是malloc来的,而str本身只是一个临时变量,临时变量的释放并不能释放掉malloc申请的内存,只是该变量被释放了而已.
    just learn
    • 已标记为答案 luyi0619 2009年8月14日 7:19
    2009年8月9日 14:06
  • 你这样写可以是可以,不过不规范,所以释放起来很麻烦.一般是不把函数内部分配的内存指针传到外部的,这样很容易产生野指针和内存泄露的问题.

    有两种标准的方法.

    1. 在函数外部分配内存存入内部.
    如,传入三个参数,一个输入,一个输出,还有一个防止内存越界的输出buffer大小
    const char *str_old="abcdefg";
    char *szTemp = new char[0x100];
    fun(str_old, szTemp, 0x100);

    然后外部用完后释放delete szTemp

    2. 双重指针输入
    char* szTemp = NULL;
    fun(str_old, &szTemp); // fun定义为fun(char*, char**);
    然后在fun内部分配,把指针保存到传进来的二重指针
    0xBAADF00D
    • 已标记为答案 luyi0619 2009年8月14日 7:19
    2009年8月9日 16:18
    版主
  • 最好遵守谁申请谁释放。如果要传出内部分配的内存,最好进行复制。否则如果传出的指针指向成员变量,则可能会出现bug或内存泄漏。
    麻烦把正确答案设为解答。
    • 已标记为答案 luyi0619 2009年8月14日 7:19
    2009年8月10日 1:09
    版主

全部回复

  • free(str)是可以的,free(str)是释放完str所指向的通过malloc申请的所有内存.在malloc时,系统会有一个数据块来纪录这一片被分配的内存.当free时系统会从这个块中获取信息并正确释放掉这些内存.
    str所指向的内存地址是malloc来的,而str本身只是一个临时变量,临时变量的释放并不能释放掉malloc申请的内存,只是该变量被释放了而已.
    just learn
    • 已标记为答案 luyi0619 2009年8月14日 7:19
    2009年8月9日 14:06
  • 问题是没有地方写free(str);啊?
    写main里不对,写fun里更不可能了,没法return了。。
    2009年8月9日 15:53
  • 你这样写可以是可以,不过不规范,所以释放起来很麻烦.一般是不把函数内部分配的内存指针传到外部的,这样很容易产生野指针和内存泄露的问题.

    有两种标准的方法.

    1. 在函数外部分配内存存入内部.
    如,传入三个参数,一个输入,一个输出,还有一个防止内存越界的输出buffer大小
    const char *str_old="abcdefg";
    char *szTemp = new char[0x100];
    fun(str_old, szTemp, 0x100);

    然后外部用完后释放delete szTemp

    2. 双重指针输入
    char* szTemp = NULL;
    fun(str_old, &szTemp); // fun定义为fun(char*, char**);
    然后在fun内部分配,把指针保存到传进来的二重指针
    0xBAADF00D
    • 已标记为答案 luyi0619 2009年8月14日 7:19
    2009年8月9日 16:18
    版主
  • 最好遵守谁申请谁释放。如果要传出内部分配的内存,最好进行复制。否则如果传出的指针指向成员变量,则可能会出现bug或内存泄漏。
    麻烦把正确答案设为解答。
    • 已标记为答案 luyi0619 2009年8月14日 7:19
    2009年8月10日 1:09
    版主