C++:由以下原因引起的未定义行为

C++: Undefined behavior caused by...?

本文关键字:未定义 C++      更新时间:2023-10-16
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(,我没有改变。完全迷路了,无法弄清楚问题的根源。

int sorted[] = {}

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

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

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

sorted[indx] = symbols[i];

嘿!这是怎么回事。。。 sorted没有空间来存储任何东西。该写入会导致未定义的行为 - 它可能会崩溃,可能会覆盖内存,或者可能会导致您的计算机添加...一。。。百。。。十亿。。。美元到您的银行账户。

int sorted[] = {}

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

更...限制模式比它默认运行,只是为了禁用最轻率的编译器扩展。这几乎适用于所有编译器。

在您的情况下

int sorted[] = {};

是完全格式不正确的C++代码,这是触发诊断消息所必需的。该诊断消息是有充分理由专门作为错误消息的,而不仅仅是警告。

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

我自己试过了,发现GCC实际上接受了这一点。这次他们在想什么?这是干什么用的?支持具有零大小尾随数组的"struct hack"对象的本地声明?别的?