c++ - 仅使用取消引用将 C 样式字符串复制到免费存储区

标签 c++ c pointers heap-memory

如标题所述,目标是在不使用任何标准库函数或下标的情况下将 C 风格的字符串复制到内存中。

这是我目前所拥有的[已解决]

#include "std_lib_facilities.h"

char* strdup(const char* p)
{
    int count = 0;
    while (p[count]) ++count;
    char* q = new char[count+1];
    for (int i = 0; i < count + 1; ++i) *(q + i) = *(p + i);
}

int main()
{
    char word[] = "Happy";

    char* heap_str = strdup(word);
}

显然,问题在于仅分配 *p(相当于 p[0])仅分配字母 "H"到内存中。我不确定如何在没有下标或 STL 函数的情况下分配 C 风格的字符串。

最佳答案

C 风格的字符串以 '\0' 结尾。需要一个字符一个字符遍历函数内部的字符串,直到遇到'\0'才知道有多长。 (这实际上就是您通过调用 strlen() 来计算它所要做的事情。)一旦知道字符串的长度,就可以分配正确的内存量,即长度 +1(因为 '\0 ').

要访问数组 p 的第 i 个元素,请使用下标:p[i]

p[i] 形式的下标被 C 标准(6.5.2.1 of C99) 和 C++ 标准(C99 的 5.2.1)。这里,pi其中一个是指向T的指针类型,另一个是整数类型(或者C++中的枚举)。因为数组名称自动转换(在大多数类型的使用中)为指向所述数组第一个元素的指针,因此 p[i] 是数组 p 的第 i 个元素。

就像基本算术一样,((p)+(i)) 等同于指针算术中的((i)+(p))。这意味着 *((p)+(i)) 等同于 *((i)+(p))。这也意味着 p[i] 等同于 i[p]

关于c++ - 仅使用取消引用将 C 样式字符串复制到免费存储区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1263447/

相关文章:

c - 通过指针的二维数组

c++ - (c++) 我需要在新类的头文件中包含什么

C++ 3 个重载中没有一个可以转换所有参数类型第 39 行 1

c++ - 初始化列表是否适用于基类?

c - C 中的分而治之范式和递归 - 合并排序示例

c - "CPU dies"(与硬件无关)是什么意思?

c - 使用 C/Intel 程序集寻求最大位图(又名位数组)性能

c++ - 使用 OpenCV、GStreamer 流式传输视频

c++ - 修改 const char* 数组的快速方法

c - 何时为 C 中的结构和 "create"函数分配内存