C++ 正确使用memset和memcpy初始化C++;

C++ 正确使用memset和memcpy初始化C++;,c++,c,memory-management,C++,C,Memory Management,我想用字符指针中的数据初始化字符数组。我为此编写了以下代码: (请原谅我对这个结构和所有东西所做的一切……实际上,这个代码应该适合更大的东西,因此这个结构和它的用法很奇怪) 你能解释一下为什么会这样吗?因为我只打印一个字符数组,所以它的长度只有16个字符,难道不应该只打印16个字符吗?这两个(有时是零,有时是一)字符来自哪里 更重要的是,我是否通过填充损坏了任何内存(不属于我的字符数组c) 您的字符串需要以NUL结尾 memcpy(segment_listing, r, _r.lengt

我想用字符指针中的数据初始化字符数组。我为此编写了以下代码:

(请原谅我对这个结构和所有东西所做的一切……实际上,这个代码应该适合更大的东西,因此这个结构和它的用法很奇怪)

你能解释一下为什么会这样吗?因为我只打印一个字符数组,所以它的长度只有16个字符,难道不应该只打印16个字符吗?这两个(有时是零,有时是一)字符来自哪里


更重要的是,我是否通过填充损坏了任何内存(不属于我的字符数组
c

您的字符串需要以NUL结尾

    memcpy(segment_listing, r, _r.length());
    memset( (segment_listing + _r.length()), ' ', padding-1);
    segment_listing[_r.length() + padding - 1] = '\0';
使用
snprintf()
,您可能会得到更好的服务,这将为您添加终止符:

    snprintf(segment_listing, sizeof(segment_listing), "%-*s",
             (int)sizeof(segment_listing)-1, r);

C字符串以0字节结尾,您在任何地方都没有考虑到这一点。
您需要用值0终止字符串,在所有计算中都必须考虑到额外的字节。

< P> >代码> StrutsMyStry

中没有空字符。假设使用<代码> STD::CUT >我假定您的问题是C++而不是C(有区别)。使用

memcpy
memset
或c样式数组的正确方法根本不正确。此外,你还想达到什么目标?@ JordBdiBing是很可怕的,因为我正在混合C和C++。注意,<代码> {R/< >对于一个名字来说是个坏主意,因为标准的名字从全局命名空间中的下划线开始,如果你想字符串只是“代码>”RITWIK“<代码>,没有空格作为填充,只需执行
strncpy(segment_listing,r,_r.length())谢谢。但是,我可以问一下,当数组不是以null结尾时,会发生什么变化吗?gcc知道我只声明了一个16大小的数组。打印16个字符后是否应该停止?另外,请告诉我是否损坏了任何内存(在当前实现中,而不是在您修改后),需要NUL终止符,以便
可以
知道何时停止读取传递到输出例程的指针。@user315052我实现了您的建议,但现在每次都有seg错误。以下是gdb输出:
#0 0x0088b761 in_uugnu cxx::u exchange_和_add(),来自/usr/lib/libstdc++.so.6(gdb)std::basic_字符串中的第1帧0x00871fe2::~basic_字符串(),来自/usr/lib/libstdc++.so.6(gdb)main中的第2帧0x08048c63(argc=1,0xE867FE2),位于bfr.cpr.cr35处@user315052谢谢。也。执行:
memset((segment_listing+_r.length()),“”,填充);段列表[_r.length()+填充-1]='\0'也解决了这个问题。(我猜清单[16]中的段是不允许的。只能在清单[15]中的段之前使用。)您可以通过调用
memset()
来模拟它。危险在于,如果覆盖缓冲区的最后一个字符,则会丢失终止符。显式地将它放在那里更安全。您需要
constexpr
,而不是
const
@RitwikG char a[16]={0};创建一个由16个元素组成的数组,初始化为null。这就像在做memset(),但更优雅。“你尝试了吗?”@ BatchyX,你能解释一下吗?在C++中,数组的大小必须是一个常数表达式,即编译时已知的表达式。常量表达式可能包含文字常量、运算符、
constepr
常量以及将
constepr
函数应用于常量表达式的结果。
const int
变量不能是常量表达式的一部分,因为它可以初始化为编译时未知的内容(例如,
time()
),因此代码无效。在本例中,使用常量表达式初始化它,因此可以将大小声明为
constexpr int
,它将是有效的。
const int SIZE = 16;  //or 17 if you want 16 + null char
//pre-initialise array - then will automatically be null terminated
char segment_listing[SIZE] = {0};
    snprintf(segment_listing, sizeof(segment_listing), "%-*s",
             (int)sizeof(segment_listing)-1, r);
const int SIZE = 16;  //or 17 if you want 16 + null char
//pre-initialise array - then will automatically be null terminated
char segment_listing[SIZE] = {0};