任何人都可以找到使用以下C ++代码将任何内容打印到控制台上的原因;
string array[] = { "a", "b", "c", "d" };
int length = sizeof(array);
try
{
for (int i = 0; i < length; i++)
{
if (array[i] != "") cout << array[i];
}
}
catch (exception &e)
{
e.what();
}
答案 0 :(得分:6)
你使用了错误的长度:
int length = sizeof(array)/sizeof(array[0])
您在控制台上看不到任何内容的实际原因是因为输出被缓冲,并且由于您没有写过换行符,因此它不会被刷新。与此同时,你的应用程序崩溃了。
答案 1 :(得分:1)
没有行尾字符。
同样如Dave所述,sizeof不是数组的长度
答案 2 :(得分:1)
此答案假定string
== std::string
。
让T为任意类型,n为任意正整数 - 然后:
sizeof(T[n]) == n * sizeof(T)
即 - sizeof(array)
不是数组的长度,而是数组使用的内存总量(在char
s中)。您的std::string
实现很可能会使用超过1 char
的内存来存储其结构。这会导致length
保持一个远大于4的值。
这导致程序从array
的末尾开始读取; C ++没有要求的操作(它是未定义的行为)。
就C ++抽象机而言,包含未定义行为的程序可以做任何事情,甚至在遇到未定义行为的程序执行点之前。在您的特定情况下,您的程序通过不打印任何内容来表现出这种行为(即使您在错误的数组索引之前已经对operator<<
进行了4次定义良好的调用)。
您已标记此eclipse-cdt
,因此我假设您正在使用GCC编译您的程序,并在具有内存保护的现代操作系统下运行它。在这种情况下,您看到的行为的实际原因可能是std::cout
正在缓冲您流入其中的前几个字符串,因此不会立即将它们打印到控制台。之后,您将进入缓冲区溢出,操作系统会使用EXC_BAD_ACCESS
信号或类似信号中断该过程。这会导致程序立即终止,这不会使std :: cout有机会刷新其缓冲值。总而言之,这意味着什么都没有打印出来。
如另一个答案中所述,您应该替换以下行:
length = sizeof(array);
使用:
length = sizeof(array)/sizeof(array[0]);
这将保证length
保留值4
,而不是值4 * sizeof(string)
,这可能是数组长度的许多倍。