Strdup指针版本需要一个临时指针
strdup pointer version needs a temporary pointer
我正在实现一个strdup函数作为练习。
char* strdupPtr(const char* str) {
const size_t sz{strlen(str)+1};
char *save, *temp;
save = temp = (char*)malloc(sz);
while((*temp++ = *str++)); // compiler warning with only 1 set of parenthesis
return save;
}
经过几次失败后,我发现当"保存"(wiki参考)指针返回时,它可以正常工作,但当"temp"返回时却不行。为什么我需要在处理指针时直接返回save而不是temp(下标数组版本无需使用save)?
在函数指针中temp
是递增的
while((*temp++ = *str++));
如果要返回temp
,那么它将不包含分配的内存的起始地址。
例如,这些用例将无效。
char *p = strdup( "Hello World" );
puts( p );
free( p );
考虑到在c++中最好使用operator new。例如
char * strdupPtr( const char *s )
{
char *p = new char[std::strlen( s ) + 1];
std::strcpy( p, s );
return p;
}
或者你甚至可以写
char * strdupPtr( const char *s )
{
char *p = new char[std::strlen( s ) + 1];
return std::strcpy( p, s );
}
相关文章:
- 函数向量_指针有不同的原型,我可以构建一个吗
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 引用一个已擦除类型(void*)的指针
- 修改函数中的指针(将另一个指针作为参数传递)
- 如何将指针从一个void函数传递到另一个C++
- 如何在没有数据拷贝的情况下从指针创建一个Eigen VectorXd对象
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- 不明白迭代器,引用和指针失效,一个例子
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 将指针分配给另一个指针时会发生什么情况?
- 将指向给定子类的指针从一个向量复制到另一个向量
- C++将一个指针分配给另一个指针时执行的类型检查
- 创建一个棋盘格或"Interweave"两个链接列表。IE 更改两个链表的指针
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 取消引用结束指针到数组类型的一个
- 更改一个指针后更改乘法对象
- const和指针(一个节点示例)
- 从函数返回指针.一个指针的值未更新