代码之家  ›  专栏  ›  技术社区  ›  9-Pin

释放具有内部空字节的动态分配字符串

  •  0
  • 9-Pin  · 技术社区  · 1 年前

    以下代码为字符数组分配256个字节,然后将空格替换为 \0 (类似什么 strtok 和 strsep 做)。

    #include <stdlib.h>
    #include <string.h>
    
    int main() {
      char *long_one = (char *)malloc(sizeof(char) * 256);
      strcpy(long_one, "Nutrition Facts");
      *(long_one+9) = '\0';
      free(long_one);
      return 1;
    }
    

    有没有 free 在第8行中,释放所有256个字节,或仅释放那些不超过 \0 ?

    2 回复  |  直到 1 年前
        1
  •  4
  •   Chris    1 年前

    free 不会像字符串处理函数那样将内存视为以null结尾的字符串,因此,是的,它将释放由分配的所有内存 malloc .

    考虑到以下情况,这是有道理的 马洛克 除了用于构建字符串的动态分配char数组外,它还用于许多其他目的。

    附加说明

    • 不要投 马洛克 C.相关阅读: Should I cast the result of malloc (in C)?
    • sizeof(char) 是 1 ,所以你可以直接通过 256 到 马洛克 .
    • 你应该检查一下 马洛克 在使用此内存之前已成功。
    • *(long_one+9) = '\0'; 等效且更易读地写成: long_one[9] = '\0';
    • 在这种情况下,动态分配与自动分配相比毫无意义。内存大小并不妨碍自动存储持续时间,也不担心自动分配的内存的生命周期 main 。你最好: char long_one[256];
    • return 1; 提示程序退出时出错。您有三种选择: return 0; ; return EXIT_SUCCESS; 或者干脆不显式返回任何内容。这个 主要的 函数隐式返回 0 如果没有显式返回值。

    考虑到其中一些建议,你的代码可能看起来像:

    #include <stdlib.h>
    #include <string.h>
    
    int main(void) {
        char *long_one = malloc(256);
        if (!long_one) {
            fprintf(stderr, "Dynamic memory allocation failed.\n");
            return EXIT_FAILURE;
        }
    
        strcpy(long_one, "Nutrition Facts");
        long_one[9] = '\0';
        free(long_one);
    
        return EXIT_SUCCESS;
    }
    
        2
  •  1
  •   Vlad from Moscow    1 年前

    如果 free 不会通过以下方式释放所有分配的内存 malloc 那么,例如,该怎么办 calloc 用零初始化分配的内存?:)

    此外,as 马洛克 如果不初始化分配的内存,则分配的内存可以包含任何垃圾,包括零。在这种情况下该怎么办?:)

    分配的内存大小存储在内部,并在释放分配的内存时使用。

    注意这一点,因为 @pmg 他在评论中写道

    strcpy(long_one, "Nutrition Facts");
    

    已将终止零字符存储在分配的内存中 '\0' 字符串文字 "Nutrition Facts" .

    如果将指针传递给函数,则可能会出现问题 free() 其没有所分配存储器的地址。

    顺便说一句,你可以使用函数 realloc 扩大或截断分配的内存。

    例如,在这句话之后

    *(long_one+9) = '\0';
    

    你可以写

    char *tmp = realloc( long_one, 10 );
    if ( tmp != NULL ) long_one = tmp;