C ++:由...引起的未定义行为?

时间:2013-06-08 21:46:11

标签: c++ undefined-behavior

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),我没有改变。完全迷失了,无法弄清楚问题源于何处。

3 个答案:

答案 0 :(得分:3)

int sorted[] = {}

好的......所以排序的是一个没有元素的数组。一些编译器会警告这个:

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

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

sorted[indx] = symbols[i];

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

答案 1 :(得分:1)

int sorted[] = {}

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

答案 2 :(得分:0)

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

在你的情况下

int sorted[] = {};

是完全错误的C ++代码,需要触发诊断消息。这个诊断消息是一个非常好的理由,特别是错误消息,而不仅仅是警告。

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

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