不确定我做了什么/没做什么,但它给了我疯狂的结果!
这是代码......
#include <iostream>
using namespace std;
int counter = 0;
int trigger = 0;
int main(){
while(1)
{
if (counter == trigger)
{
cout << "Beep\n" + counter;
counter = 0;
trigger = (rand() % 20000000);
}
counter++;
}
return 0;
}
看起来很简单吧?运行它,看看会发生什么!
我从扬声器中听到一声可听见的声音,并对此表示欢迎......
任何想法??
-Adrian
答案 0 :(得分:4)
本声明
cout << "Beep\n" + counter;
当counter
大于sizeof( "Beep\n" )
时,具有未定义的行为,因为这是尝试访问字符串文字之外的内存。
也许你的意思是以下
cout << "Beep\n" << counter << endl;
或
cout << "Beep " << counter << endl;
在任何情况下,都不需要将变量counter
和trigger
声明为全局变量。
而不是
int counter = 0;
int trigger = 0;
int main(){
//...
你可以写
int main(){
int counter = 0;
int trigger = 0;
//...
答案 1 :(得分:3)
"Beep\n" + counter
会导致"Beep\n"
衰减到指向第一个字符'B'
的指针,并将该指针偏移counter
。
例如,
counter = 0
,"Beep\n" + 0
评估为"Beep\n"
,counter = 1
,"Beep\n" + 1
评估为"eep\n"
(指向第二个字符),counter = 2
,"Beep\n" + 2
评估为"ep\n"
,直到你在counter > 4
之后阅读不属于你的记忆。
这不是内存泄漏,那是未定义的行为。