当另一个数组是 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?
。这意味着,这里a
是AAAABBBB
但我宣布长度为 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 是不是会更改数组长度?的主要内容,如果未能解决你的问题,请参考以下文章