2014-03-13 91 views
3
char a[3]={'U','S','A'}; 
cout<<a; 

它怎样才能打印USA当a是长度为3的字符数组,而没有内存'\0'
哪里会存储'\0'C++字符串大小错误

+7

未定义的行为。数组之后恰好有一个'0'。 – juanchopanza

+0

std :: cout.write(a,sizeof(a)) –

+1

反正你应该使用'std :: string' – Brian

回答

-4

插入终止:

char a[4]={'U','S','A', '\0' }; 

4

COUT将打印直到遇到\ 0。

现在,如果碰巧在物理内存中,数组旁边的字节值为0,cout将把它作为终止符。它可能发生,因为下一个字节可能有任何垃圾值,包括0.

但是,不能保证你的阵列边界旁边会有什么。在其中一种情况下,您发现0并不意味着它会继续用于其他情况。实际结果是未定义的行为,在这种特殊情况下,它与数组以null结尾的情况下预期的cout行为相匹配。

-3

Q:如果a是长度为3的字符数组,并且 没有内存'\ 0',它如何打印USA?

只需打印阵列中的所有字符。

例如

for (char c : a) std::cout << c; 
std::cout << std::endl; 

在这种情况下终止零不是必需的。

如果你的编译器不支持基于for语句的范围内,那么你可以使用一个普通的循环:

for (size_t i = 0; i < sizeof(a); i++) std::cout << a[i]; 
std::cout << std::endl; 

或者实际上你可以使用成员函数write

std::cout.write(a, sizeof(a)); 

如果你将它打印以下方式

std::cout << a; 

那么程序就会有你ndefined行为。不能保证在数组之后内存中会有一个零字节。