在不使用标准库的情况下复制字符串
Copying a string without using standard library
我有一个小问题,无法理解这里出了什么问题。我这里有以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void copyFrom(char * mStr, char * str);
int main() {
char * srcStr = "Robert bought a good ford car";
char * dstStr = NULL;
copyFrom(srcStr, dstStr);
printf("The string copied here is %s", dstStr);
return 0;
}
void copyFrom(char * str, char * mStr)
{
if(!mStr) {
mStr = (char *)malloc((strlen(str)) + 1);
if(mStr == NULL)
return;
}
while(*mStr++ = *str++) {
;
}
mStr[strlen(str)] = ' ';
}
这不会复制字符串,但如果使用数组而不是dstStr的char指针,则一切都很好。
你能告诉我这里出了什么问题吗?
您需要在对mStr执行malloc后返回它的值。现在,malloc的返回值和指向字符串副本的指针在您退出函数时消失。它从malloc泄漏内存,因为它失去了对它的跟踪
将您的功能更改为char* copyFrom(const char * str)
然后从该函数返回mStr。然后你可以写dstStr = copyFrom(srcStr)
现在,POSIXC已经有了这个功能。它被称为strdup
。
在C中,偶数指针是按值传递的。当您将指针传递给函数时,该函数将接收一个副本,即指向与调用函数中的指针相同位置的新指针。
因此,在您的代码中,当您传递dstStr
时,您传递的是一个空指针。mStr
是一个新的空指针。当您为mStr
分配内存时,该内存将分配给这个新指针,而不是dstStr
。因此,当函数返回时,调用函数中的dstStr
仍然为NULL,并且没有任何内容指向copyFrom()
中分配的内存。你的内存泄漏了!
您需要将dststr()
作为两级指针传递,以便更改它在调用函数中指向的内容:
void copyFrom(char * str, char **dstStr)
{
char* mStr;
mStr = (char *)malloc((strlen(str)) + 1);
if(mStr == NULL)
return;
while(*mStr++ = *str++) {
;
}
mStr[strlen(str)] = ' ';
*dststr = mStr;
return;
}
当然,您的函数声明和调用也需要相应地更改。您的调用需要传递&dstStr
作为参数,而不仅仅是dstStr
。
char * dstStr = NULL;
copyFrom(srcStr, dstStr);
printf("The string copied here is %s", dstStr);
dstStr
为NULL,第一行设置它。当copyFrom
分配字符串时,它不会将该字符串返回给调用者。所以你的printf
得到一个NULL。
,你可以做到这一点
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void copyFrom(char * mStr, char * str);
int main() {
char * srcStr = "Robert bought a good ford car";
char * dstStr = NULL;
dstStr = (char *)malloc((strlen(srcStr)) + 1);
copyFrom(srcStr, dstStr);
printf("The string copied here is %s", dstStr);
return 0;
}
void copyFrom(char * str, char * mStr)
{
while(*mStr++ = *str++) {
;
}
mStr[strlen(str)] = ' ';
}
dstStr未分配,因此您不会在任何地方对数据进行签名。使用malloc分配一个合适的内存块,然后进行复制。
它使用数组的原因是字符串存储在堆栈上,内存自动为其覆盖
这也是C而不是C++,因为C++字符串处理是通过std::string完成的。
您可以通过引用传递dest,而不是返回:
void copyFrom(const char * src, char *& dest);
int main() {
char * srcStr = "Robert bought a good ford car";
char * dstStr = 0;
copyFrom(srcStr, dstStr);
printf("The string copied here is %s", dstStr);
return 0;
}
void copyFrom(char * str, char *& mStr)
{
if(!mStr) {
mStr = (char *)malloc((strlen(str)) + 1);
if(mStr == NULL)
return;
}
char* it = mStr;
while(*it++ = *str++)
{
;
}
*it = 0;
}
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 在不复制临时对象的情况下延长其生存期
- 在这种情况下,我真的复制了字节还是复制了字符?
- QT QOpenGLWidget:如何在不使用数据块复制的情况下修改VBO中的单个顶点值?
- 如何在不复制的情况下将一个向量移动到另一个向量中
- 如何在没有复制构造函数的情况下为地图设置值?
- 在这种情况下,使用 string_view 是否会导致不必要的字符串复制?
- 我有两棵二叉树.我想在不更改输入树的情况下深度复制两个二叉树的结果
- 如何在不复制的情况下操作 QByteArray 对象?
- 在不复制数据的情况下,将double数组转换为只有double成员的structs数组
- 有没有一种方法可以在不复制数据的情况下从string_view创建字符串流
- 是否可以在不复制的情况下访问undered_map中的元素
- 如何在不复制数据的情况下将 cv::Mat 转换为 2d 标准::矢量
- 如何在自定义删除器的情况下复制unique_ptr
- 如何在不复制内存的情况下复制Zeromq中的消息
- 在不使用字符串函数的情况下复制C 中的字符数组
- 在不使用标准库的情况下复制字符串
- 在不使用元素复制赋值运算符的情况下复制向量 - 可移植性
- 如何:在没有适当的默认构造函数的情况下复制类的实例;它的成员没有默认构造函数
- 渲染缓冲区可以在不附加到帧缓冲区的情况下复制吗?