问题描述:
const char* str = "helloworld";
strncpy_s(pd.arr, str, sizeof(str));
我试图将字符串"helloworld"复制到结构体pd的arr中, arr是一个64大小的字符数组,然而测试时发现只复制了hell。
解决思路:
1. 首先我想到的是有没有特殊字符,很显然没有;
2. 在没有想到其他原因下,我打算试一下别的数据能不能复制成功,经过大量的测试发现,如果str的字符数量小于等于4字符,则可以全部复制到结构体的arr中,如果大于4字符则会被阶段,然后打印了下sizeof(str)发现其值是4.
原因:
str是一个字符指针,而sizeof是取静态的长度,也就是一个指针的长度,在32位机器下一个指针是4字节,而64位机器下一个指针是8字节,本机虽然是64位,由于我选择的系统是32位,因此指针的大小是4字节,这也就解释了为什么只能复制4个字符。
解决办法
用strlen来返回字符串的长度,如下面的测试代码:
int main() {
const char* str = "Hello World!";
int size_sizeof = sizeof(str);
int size_strlen = strlen(str);
std::cout << "size_sizeof = " << size_sizeof << "---" << "size_strlen = " << size_strlen << std::endl;
return 0;
}
输出结果如下:size_sizeof = 8---size_strlen = 12,可以看到64位机器下指针占8字节,字符串包含12字符,并没有包含结束符,如果要保存到数组中小心空间要多开辟一个字符的空间。