忽略长度超过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
可以概括为四个步骤:
- 确定要分配的内存量.
- 为新字符串分配内存.
- 将旧字符串复制到新分配的缓冲区中.
- 返回指向新分配的缓冲区的指针.
已修复:(在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;
}