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

问题描述 投票:0回答:2

以下代码为字符数组分配 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;
}

第 8 行中的

free
是否释放所有 256 个字节,还是仅释放直到并包括
\0
的字节?

c
2个回答
2
投票

free
不会将内存视为以 null 结尾的字符串,所以是的,它会释放
malloc
分配的所有内存。

补充说明:

  • 不要在 C 中强制转换
    malloc
    。相关阅读:我应该强制转换 malloc 的结果(在 C 中)吗?
  • sizeof(char)
    1
    ,因此您可以将
    256
    传递给
    malloc
  • 在使用此内存之前,您应该检查
    malloc
    是否成功。
  • *(long_one+9) = '\0';
    等效且更易读地写为:
    long_one[9] = '\0';
  • 在这种情况下动态分配与自动分配相比是没有意义的。
    char long_one[256];
  • return 1;
    表示程序因错误而退出。您可以选择三个选项:
    return 0;
    return EXIT_SUCCESS;
    或者只是不明确返回任何内容。如果没有显式返回值,则
    main
    函数会隐式返回
    0

0
投票

如果 free 不会通过

malloc
释放所有分配的内存,那么如何处理例如用零初始化分配的内存的
calloc
?:)

此外,由于

malloc
不会初始化分配的内存,因此分配的内存可以包含任何垃圾,包括零。再说一次,在这种情况下该怎么办?:)

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

© www.soinside.com 2019 - 2024. All rights reserved.