当另一个数组是 memset 时,memset 是不是会更改数组长度?

Posted

技术标签:

【中文标题】当另一个数组是 memset 时,memset 是不是会更改数组长度?【英文标题】:Does memset change the array length when another array is memset?当另一个数组是 memset 时,memset 是否会更改数组长度? 【发布时间】:2020-06-13 12:22:35 【问题描述】:

程序-1->

#include <iostream>
#include <cstring>

int main()

    char a[4];
    memset(a, 'A', sizeof a);
    std::cout << a << '!';

    return 0;

program-1 输出我所期望的AAAA! 但只要我引入另一个字符串(char 数组),情况就会发生变化!

程序-2->

#include <iostream>
#include <cstring>

int main()

    char a[4], b[4];
    memset(a, 'A', sizeof a);
    memset(b, 'B', sizeof b);
    std::cout << a << '!';
    std::cout << ' ' << b << '?';

    return 0;

program-2 输出 AAAABBBB! BBBB?。这意味着,这里aAAAABBBB 但我宣布长度为 4!那么发生了什么?当另一个数组是memset 什么的时候,memset 会改变数组长度吗?!

我的构建线是g++ -Wall -Wextra -std=c++17 main.cpp -o main

【问题讨论】:

std::cout 打印字符直到\0。你的数组中没有这样的,所以它继续经过a,即 UB 所以如果我想用 memset 正确地填充一个字符串(最后有一个\0),该怎么做? 您需要为空终止符“\0”再分配一个字符。而不是 4 分配 5。char a[5], b[5]; 和 memset 永远不会改变数组长度。 @Adam 什么是 memset 行? 另外,在 C++ 中使用 std::string 代替字符数组,除非您有充分的理由使用字符数组。 (你几乎肯定不会。)C 拼写“字符串”char[]。 C++ 拼写字符串std::string 【参考方案1】:

memset 会改变数组长度吗

没有。 Memset 不会更改数组长度。事实上,任何数组的长度在数组的整个生命周期内都不会改变。

那到底是怎么回事?

您使用的流插入运算符具有字符串必须为空终止的前提条件。违反先决条件会导致未定义的行为。

您将非空终止字符串插入到字符流中。这违反了前提条件并且程序的行为是未定义的。

【讨论】:

我知道你回答了上面提到的问题,但是你能不能提供一种方法让我可以 memset 一个数组,同时在最后有一个 \0 可以使用赋值运算符来设置一个字符的值。 你的意思是,声明和memset可以保持不变,在memset之后,我应该说a[4] = '\0';?好吧,它不起作用!能详细点吗? 索引 4 超出了数组的范围。分配到边界之外具有未定义的行为。 那你有什么建议?你能让它比“赋值运算符”更清晰吗?请不要只说什么是错的,你能补充什么会起作用吗?

以上是关于当另一个数组是 memset 时,memset 是不是会更改数组长度?的主要内容,如果未能解决你的问题,请参考以下文章

静态数组上的 memset

Memset 没有填满整个指针数组 c++

为啥memset不能将数组元素初始化为1

Memset 将数组元素设置为 0

关于memset()

使用 memset 和 int 值初始化整数数组 - 失败