我想使用字符指针的数据初始化字符数组。我写了以下代码:
(请原谅我在结构体中所做的一切,实际上这段代码应该适用于更大的东西,因此这个结构体和它的使用看起来有些奇怪)
然而,当我运行我的代码时,在字符串末尾出现了奇怪的字符:
请问您能解释这是为什么吗?因为我只在打印长度为16的字符数组,难道不应该只打印出16个字符吗?那两个(有时候为零,有时候为一个)字符来自哪里呢?更重要的是,我的填充是否会破坏任何内存(不属于我的字符数组)?
(请原谅我在结构体中所做的一切,实际上这段代码应该适用于更大的东西,因此这个结构体和它的使用看起来有些奇怪)
#include <iostream>
#include <string>
struct ABC
{
char a;
char b;
char c[16];
};
int main(int argc, char const *argv[])
{
struct ABC** abc;
std::string _r = "Ritwik";
const char* r = _r.c_str();
if (_r.length() <= sizeof((*abc)->c))
{
int padding = sizeof((*abc)->c) - _r.length();
std::cout<<"Size of `c` variable is : "<<sizeof((*abc)->c)<<std::endl;
std::cout<<"Value of padding is calculated to be : "<<padding<<std::endl;
char segment_listing[ sizeof((*abc)->c)];
std::cout<<"sizeof segment_listing is "<<sizeof(segment_listing)<<std::endl;
memcpy(segment_listing, r, _r.length());
memset( (segment_listing + _r.length()), ' ', padding);
std::cout<<segment_listing<<std::endl;
}
return 0;
}
然而,当我运行我的代码时,在字符串末尾出现了奇怪的字符:
(rh4dev01:~/rough) rghosh> ./crptr
Size of `c` variable is : 16
Value of padding is calculated to be : 10
sizeof segment_listing is 16
Ritwik °×
(rh4dev01:~/rough) rghosh> ./crptr
Size of `c` variable is : 16
Value of padding is calculated to be : 10
sizeof segment_listing is 16
Ritwik Ñ
(rh4dev01:~/rough) rghosh> ./crptr
Size of `c` variable is : 16
Value of padding is calculated to be : 10
sizeof segment_listing is 16
Ritwik g
(rh4dev01:~/rough) rghosh> ./crptr
Size of `c` variable is : 16
Value of padding is calculated to be : 10
sizeof segment_listing is 16
Ritwik pô
(rh4dev01:~/rough) rghosh> ./crptr
Size of `c` variable is : 16
Value of padding is calculated to be : 10
sizeof segment_listing is 16
Ritwik
(rh4dev01:~/rough) rghosh> ./crptr
Size of `c` variable is : 16
Value of padding is calculated to be : 10
sizeof segment_listing is 16
Ritwik àå
(rh4dev01:~/rough) rghosh> ./crptr
Size of `c` variable is : 16
Value of padding is calculated to be : 10
sizeof segment_listing is 16
Ritwik »
(rh4dev01:~/rough) rghosh> ./crptr
Size of `c` variable is : 16
Value of padding is calculated to be : 10
sizeof segment_listing is 16
Ritwik pZ
请问您能解释这是为什么吗?因为我只在打印长度为16的字符数组,难道不应该只打印出16个字符吗?那两个(有时候为零,有时候为一个)字符来自哪里呢?更重要的是,我的填充是否会破坏任何内存(不属于我的字符数组)?
std::cout
,我认为您的问题是指 C++ 而不是 C(两者有区别)。正确使用memcpy
、memset
或 C 风格数组的方法是根本不用。此外,您究竟想要实现什么? - Grizzly_r
不是个好主意,因为标准将以下划线开头的名称保留在全局命名空间中供实现使用。 - Billy ONeal