我正在C中实现strdup()
,我是C的新手,我正在尝试构建自己的库。我正在使用来自strdup()
的实际string.h
来测试我的,当我针对主程序测试我的源时遇到了总线错误,但是当我使用实际的strdup()
时没有。此外,我不能使用除malloc()
之外的任何现有功能。
源代码:
#include <stdlib.h>
char *ft_strdup(char *src)
{
char *str;
int len;
while (src[len])
len++;
str = (char*)malloc(sizeof(*str) * (len+1));
while (*src)
*str++ = *src++;
*str = '\0';
return (str);
}
为什么我一直收到总线错误?
答案 0 :(得分:9)
尝试以下修复:
len
。malloc
's return value,并且不使用sizeof(char)
,它在标准中定义为1,每个cstd 6.5.3.4p4:
当sizeof应用于具有char,unsigned char或者类型的操作数时 signed char,(或其合格版本),结果为1。
str
指针#include <stdlib.h>
char *ft_strdup(char *src)
{
char *str;
char *p;
int len = 0;
while (src[len])
len++;
str = malloc(len + 1);
p = str;
while (*src)
*p++ = *src++;
*p = '\0';
return str;
}
答案 1 :(得分:4)
如果你必须实现自己的strdup
函数,至少要尽可能多地依赖string.h的其余部分。其中许多功能都经过优化,并且比您自己编写的功能更快。例如,strlen
可能正在使用SSE指令,而手动搜索空终止符字节则不然。它的代码也更少,总是更好。简而言之,我建议这样做:
#include <stdlib.h>
#include <string.h>
char *ft_strdup(const char *s1)
{
char *str;
size_t size = strlen(s1) + 1;
str = malloc(size);
if (str) {
memcpy(str, s1, size);
}
return str;
}