C++ 循环中的(非)静态对象

C++ 循环中的(非)静态对象,c++,static,C++,Static,书中有一个关于静态/非静态对象的例子 char buf[MAX]; long count=0; int i=0; while(i++<=MAX) if(buf[i]=='\0') { buf[i]='*'; ++count; } assert(count<=i); charbuf[MAX]; 长计数=0; int i=0; 虽然(i++它不仅是一个坏的解决方案,它是一个强的非解决方案< /强>。您不能在数组的边界上进行索引。如果您这样

书中有一个关于静态/非静态对象的例子

char buf[MAX];
long count=0;
int i=0;
while(i++<=MAX)
    if(buf[i]=='\0') {
        buf[i]='*';
        ++count;
    }
assert(count<=i);
charbuf[MAX];
长计数=0;
int i=0;
虽然(i++它不仅是一个坏的解决方案,它是一个强的非解决方案< /强>。您不能在数组的边界上进行索引。如果您这样做,则对于实现正确的C++程序,您有一个<强>不可解的< /强>问题。

普通C++实现中,有时可以在代码之后直接将代码< >计数>代码放入堆栈中,所以如果你过索引然后写,你可以修改<代码>计数>代码>,然后对纯粹的直接写入到它的代码< >代码>值的任何假设都是不正确的,因为t这是一个通过超索引操作对其进行的写入


如果现在将其设置为
静态
,则变量将分配到程序的其他部分(通常是
.bss
用于0-初始化,而
.data
用于其他初始化数据),普通实现中的count变量将不再分配到数组旁边,这将导致另一个事件发生:您可能会覆盖数组旁边的任何内容,而不是覆盖
count

该示例根据内存中变量的特定布局进行计数,即
count
紧跟在
buf
之后。通过使
count
静止,它被放置在内存的另一部分,而其他东西则被破坏。问题并没有消失,症状只是改变了。


但是,至于为什么将
count
声明为
static
可能会使它看起来有效。当
count
声明为非
static
时,它通常会在内存(堆栈上)中的
buf[]
之后立即存在。但是,当声明为
static
时,它将不在堆栈上,因此在写入超过
buf[]结尾时不会被损坏

我同意,如果超出数组边界,则会导致越界异常。或者,在非托管语言(如C/C++中)中,您可能会将非空终止字符串的内存写入/读取到下一批内存地址中。运行到另一个对象中的内存并不有趣

我有点好奇你的静态对象在哪里,你把它们都声明为变量,没有看到静态对象


上面的代码应该总是超过数组,因为我首先检查max,然后增加i,这使i比max多了一个,给你一个off by 1的错误。

我想读这本书,但我想它显示了“巫毒编程”的示例,你尝试随机的东西,直到它停止破坏,并称之为成功

正如其他地方提到的,通过声明它为static,您所要做的就是将count移动到另一个位置,这意味着断言可能会通过。对于没有经验的程序员来说,提交就足够了,此时您的生产环境中存在缓冲区溢出代码


当然,我希望“我”然后会被覆盖,这会更糟,因为它是循环的一个控制变量,但我可能错了。

这没关系,但是覆盖计数又如何?本节的想法是关于覆盖变量。你确定你已经发布了完整的代码吗?我错过了函数声明,无法发现任何问题em与代码…@DarkDust,错误是使用
我还刚刚意识到循环中的
++
将使其溢出,即使
啊ok,因为错误的“while…”我从MAX中取出,并写入buf[MAX+1],这是计数的地方。我说得对吗?很好,我确实错过了i++实际上会使
i
得到MAX+1。@黑暗:它也会使
i
等于
MAX
,这同样糟糕。