c - K&R 第 6 章中的 strdup() 在未分配 sizeof(char) * strlen(s) 位时如何工作?

标签 c malloc

在 K&R 第 6 章中,它们具有函数 strdup(char *s),它意味着将 s 复制到内存中并返回其位置,p.

/* strdup: make a duplicate of s */ 
char *strdup(char *s) {
    char *p; 

    p = (char *)malloc(strlen(s) + 1); /* plus one for '\0' */ 
    if (p != NULL) 
        strcpy(p, s); 
    return p; 
}

然而,在 malloc 调用中,它们只分配了 strlen(s) + 1 字节。为了让这个字符数组工作,它不是必须是:malloc(sizeof(char) * (strlen(s) + 1))

最佳答案

sizeof(char) 保证为 1,所以

malloc( sizeof(char) * ( strlen(s) + 1 ) )

简化为

malloc( strlen(s) + 1 )

注意:

  • sizeof 返回以字节(而不是位)为单位的大小。
  • malloc 需要一个以字节为单位的大小(而不是位)。
  • 一个字节(char)可能有超过 8 位。 (金额由 CHAR_BIT 给出。)

关于c - K&R 第 6 章中的 strdup() 在未分配 sizeof(char) * strlen(s) 位时如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62648943/

相关文章:

c++ - 文件流实际上是如何工作的?

c - 访问 struct 中的 char 数组显示越界错误

c - 使用C99标准导致GCC编译错误

c - 在定义整数常量表达式时间接禁止(或不禁止?)运算符(在 C 中)

c - SIGABRT 为指针数组中的元素分配空间时

c - 为什么下面的代码容易受到堆溢出攻击

c - glib 内存分配 VS std *alloc 和 free

c - 释放内存(或分配)时出现问题

c - 编译后 Visual Studio 卡住。当我尝试启动应用程序时,资源管理器也是如此

c - 如何在 C 中直接访问原始高清数据?