1
int size = 0;
int sorted[] = {};
int symbols[] = {8, 9, 13, 16, 16, 16, 17, 17, 17, 18, 18, 18, 20, 20, 27, 
    32, 33, 34, 35, 36, 37, 38, 39, 40, 44, 45, 46, 48, 48, 48, 49, 49, 49, 49, 
    50, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 53, 53, 53, 54, 54, 54, 55, 55, 
    55, 56, 56, 56, 57, 57, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 
    77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 93, 112, 113, 
    114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 160, 161, 161, 162, 162, 
    163, 164, 164, 165, 186, 186, 186, 187, 187, 187, 188, 188, 188, 188, 189, 
    189, 189, 190};

int i = 0;
while(symbols[i] != 190){
    size++;
    if(symbols[i+1] == 190) {
        size++;
    }
    i++;

}

int indx = 0;
for(int i = 0; i < size-1; i++) {
    if(symbols[i] != symbols[i+1]) {
        sorted[indx] = symbols[i];
        indx++;
    }
}

我找不到问题所在。什么可能导致未定义的行为?for 循环后的大小变量变为 27(应该是 123),我没有更改。完全迷失了,无法弄清楚问题出在哪里。

4

3 回答 3

4
int sorted[] = {}

好的... so sorted 是一个没有元素的数组。一些编译器会对此发出警告:

test.cpp(217) : error C2466: cannot allocate an array of constant size 0

但是让我们假设它适用于您的编译器并创建一个常量大小为 0 的数组......然后呢?您的代码执行此操作:

sorted[indx] = symbols[i];

嘿!这里发生了什么……sorted没有空间存放任何东西。该写入会导致未定义的行为 - 它可能会崩溃,它可能会覆盖内存,或者它可能会导致您的计算机向您的银行帐户添加......一......一千......十亿......美元。

于 2013-06-08T21:48:26.787 回答
2
int sorted[] = {}

这将创建一个包含 0 个元素的数组。

于 2013-06-08T21:48:59.833 回答
1

以比默认运行更具...限制性的模式运行编译器总是一个好主意,只是为了禁用最粗心的编译器扩展。这适用于几乎所有的编译器。

在你的情况下

int sorted[] = {};

是完全格式错误的 C++ 代码,它是触发诊断消息所必需的。该诊断消息有一个很好的理由特别是错误消息,而不仅仅是警告。

严格来说,即使编译器实现了很多奇怪的扩展,我仍然很惊讶有一个允许这个声明通过。那是什么编译器?

只是自己尝试了一下,发现GCC实际上接受了这一点。这次他们在想什么?它是干什么用的?要支持带有零大小尾随数组的“struct hack”-ed 对象的本地声明?还有什么?

于 2013-06-08T22:59:32.610 回答