我试着做了自己的strdup函数来练习我的C技能,但我不确定它是否合法.

该函数如下所示:

char*
strdup(char* str) {
    char* dup_str;
    int len;
    for (len = 0; *str != '\0'; ++len) {
        dup_str = str;
        dup_str++;
        str++;
    }
    
    dup_str -= len;
    return dup_str;
}

我已经测试了一下,但我仍然不确定它是否合法.这可能是完全不正确的,所以我很惊讶它现在的工作方式.

推荐答案

忽略长度超过INT_MAX个字符的字符串所发生的未定义行为,您的代码等同于:

char *my_strdup( char *old ) {  // XXX Shouldn't require a modifiable string.
   if ( *old ) {
      return old;               // XXX Not a pointer to a new string.
   } else {
      char* indeterminate;
      return indeterminate;     // XXX Indeterminate value.
   }
}

这是完全错误的.对于初学者来说,strdup‘S的主要目的是分配一个新的字符串,但您的函数不分配内存.

strdup可以概括为四个步骤:

  1. 确定要分配的内存量.
  2. 为新字符串分配内存.
  3. 将旧字符串复制到新分配的缓冲区中.
  4. 返回指向新分配的缓冲区的指针.

已修复:(在OPtry 修复 comments 后添加.)

char *my_strdup( const char* old ) {
   size_t n = strlen( old ) + 1;
   char *new = malloc( n );
   if ( !new ) {
      errno = ENOMEM;
      return NULL;
   }

   return memcpy( new, old, n );
}

我们还可以替换其他字符串函数.

size_t my_strlen( const char *str ) {
   size_t len = 0;
   while ( *( str++ ) )
      ++len;

   return len;
}
void *my_memcpy( void *restrict dst, const void *restrict src, size_t count ) {
   void *rv = dst;

   while ( count-- )
      *( dst++ ) = *( src++ );

   return rv;
}

C++相关问答推荐

自定义malloc实现上奇怪的操作系统依赖行为

是否定义了数组指针类型转换为指针类型?""""

当main函数调用被重构时,C函数给出错误的结果

单指针和空参数列表之间的函数指针兼容性

DPDK-DumpCap不捕获端口上的传入数据包

显式地将值转换为它从函数返回的类型的含义是什么?

将指针作为参数传递给函数

将常量转换为指针会增加.数据大小增加1000字节

如何使用C for Linux和Windows的标准输入与gdb/mi进行通信?

使用错误的命令执行程序

解决S随机内存分配问题,实现跨进程高效数据共享

在句子中转换单词的问题

为什么数组的最后一个元素丢失了?

C";中的ANN运行时判断失败#2-变量outputLayer;周围的堆栈已损坏.运行后出错

基于蝶数恰好有8个除数的事实的代码

在NASM中链接Linux共享库时出错-';将R_ X86_64_;foo';

将char*铸造为空**

传递参数:C 和 C++ 中 array 与 *&array 和 &array[0] 的区别

将数组返回到链表

int 与 size_t 与 long