正确填充char指针

时间:2019-05-08 13:45:37

标签: c++ string pointers

我有一个char指针:

char* s = new char[150];

现在如何填充它?这个:

s="abcdef";

给出警告,建议不要使用字符串文字和char*之间的转换,但是通常可以。

此:

char* s = new[150]("abcdef");

不起作用,出现错误。

如何正确执行此操作?请注意,我希望内存分配具有150 * sizeof(char)字节并包含“ abcdef”。我了解malloc,但是可以使用new吗?

它是我不能使用标准库的作业。

4 个答案:

答案 0 :(得分:7)

这一系列陈述

char* s = new char[150];
s="abcdef";

导致内存泄漏,因为首先分配了一个内存,并将其地址分配给了指针s,然后用字符串常量"abcdef"的地址重新分配了指针。而且,C ++中的字符串文字(与C相反)具有常量字符数组的类型。

如果您为字符串分配了内存,则应该使用C标准函数strcpy或C标准函数strncpy复制内存中的字符串。

例如

char* s = new char[150];
std::strcpy( s, "abcdef" );

const size_t N = 150;
char* s = new char[N];
std::strncpy( s, "abcdef", N );
s[N-1] = '\0';

甚至是以下方式

#include <iostream>
#include <cstring>

int main()
{
    const size_t N = 150;
    char *s = new char[N]{ '\0' };

    std::strncpy( s, "abcdef", N - 1 );

    std::cout << s << '\n';

    delete []s;
}

无论如何,最好使用标准类std::string

std::string s( "abcdef" );

或者例如

std::string s;
s.assign( "abcdef" );

答案 1 :(得分:3)

在不使用C ++中使用标准库的情况下为字符串创建一个存储区然后填充它的基本过程如下:

  • 使用new创建适当大小的内存区域
  • 使用循环将字符从字符串复制到新区域

所以源代码如下:

// function to copy a zero terminated char string to a new char string.
// loop requires a zero terminated char string as the source.
char *strcpyX (char *dest, const char *source)
{
    char *destSave = dest;   // save copy of the destination address to return

    while (*dest++ = *source++);   // copy characters up to and including zero terminator.

    return destSave;  // return destination pointer per standard library strcpy()
}


// somewhere in your code

char *s1 = new char [150];

strcpyX (s1, "abcdef");

答案 2 :(得分:2)

给出一个字符数组:

char * s = new char [256];

以下是填充指针的方法:

std::fill(&s, &s + sizeof(s), 0);

以下是填充 数组的方法:

std::fill(s, s+256, '\0');

以下是分配复制文本数组中的方法:

std::strcpy(s, "Hello");

您也可以使用std::copy

static const char text[] = "World";
std::copy(text, text + sizeof(text), s);

请记住,指针,数组和C-Style字符串是不同的概念和对象。

修改1:更喜欢std::string
在C ++中,更喜欢将std::string用于文本而不是字符数组。

std::string s;
s = "abcdef";
std::cout << s << "\n";

答案 3 :(得分:1)

为该字符串分配内存后,可以使用strcpy来填充它:

strcpy(s, "abcdef");