C 警告-“;未定义的行为[-Waggressive循环优化]”;

C 警告-“;未定义的行为[-Waggressive循环优化]”;,c,C,我正在尝试使用C编程语言通过UART发送字符串。我通过将我的字符一个接一个地加载到THR寄存器中来实现这一点,如下所示: unsigned char posiljka[] = "Ziga Lausegger"; while(1){ for ( int i = 0 ; i < ( sizeof(posiljka)/sizeof(posiljka[0]) ) ; ++i ){ THR = posiljka[i]; } 无符号字符posiljka[]

我正在尝试使用C编程语言通过UART发送字符串。我通过将我的字符一个接一个地加载到THR寄存器中来实现这一点,如下所示:

unsigned char posiljka[] = "Ziga Lausegger";    

while(1){

    for ( int i = 0 ; i < ( sizeof(posiljka)/sizeof(posiljka[0]) ) ; ++i ){
        THR = posiljka[i];
    }
无符号字符posiljka[]=“Ziga lauseger”;
而(1){
对于(int i=0;i<(sizeof(posiljka)/sizeof(posiljka[0]);+i){
THR=posiljka[i];
}

在第二种情况下,当我更改
时,代码访问了
posiljka[sizeof(posiljka)/sizeof(posiljka[0])]
,它在数组边界之外

在这种情况下,
sizeof(posiljka)/sizeof(posiljka[0])
15
,因此
posiljka[15]
是包含空字符的数组元素的一次传递

代码“工作”是未定义的行为



未定义行为的一个有趣方面是,编译器在使用“积极循环优化”时,有时会检测到这种数组外访问。由于它是UB,编译器可以跳过尝试posiljka[15]
(或者在周二可能不会)在第二种情况下,代码访问了数组边界之外的
posiljka[sizeof(posiljka)/sizeof(posiljka[0])]

在这种情况下,
sizeof(posiljka)/sizeof(posiljka[0])
15
,因此
posiljka[15]
是包含空字符的数组元素的一次传递

代码“工作”是未定义的行为



未定义行为的一个有趣方面是,编译器在使用“积极循环优化”时,有时会检测到这种数组外访问。由于它是UB,编译器可以跳过尝试posiljka[15](或者在周二可能不会),因此循环的迭代次数比定向的少1次。

数组的最后一个元素位于索引
sizeof(posiljka)/sizeof(posiljka[0])-1
。如果更改
,数组的最后一个元素位于索引
sizeof(posiljka)/sizeof(posiljka[0])-1
。如果您更改
它告诉您您正在调用未定义的行为-这是因为您的读取超出了数组的限制。您知道数组是零索引的吗?
0
14
都是有效索引。天哪。我忘记了基本内容…它从0开始!!!=)谢谢大家。它告诉您正在调用ng未定义的行为-这是因为您的读取超出了数组的限制。您知道数组是零索引的吗?
0
to
14
是有效的索引。天哪。我忘记了基本内容…它从0开始!!!=)谢谢大家。
unsigned char posiljka[] = "Ziga Lausegger";    

while(1){

    for ( int i = 0 ; i <= ( sizeof(posiljka)/sizeof(posiljka[0]) ) ; ++i ){
        THR = posiljka[i];
    }
/home/ziga/Dropbox/workspace/mikrokrmilniki/LPC4088/primeri/delujoci/010-uart> make -j2
compiling main.c (gcc)
main.c: In function 'main':
main.c:48:18: warning: iteration 15u invokes undefined behavior [-Waggressive-loop-optimizations]
    THR = posiljka[i];
                  ^
main.c:42:3: note: containing loop
   for ( int i = 0 ; i <= ( sizeof(posiljka)/sizeof(posiljka[0]) ) ; ++i ){
   ^
linking executable.elf (gcc)

*****
***** You must modify vector checksum value in *.bin and *.hex files.
*****

arm-none-eabi-size executable.elf
   text    data     bss     dec     hex filename
  26496     188     464   27148    6a0c executable.elf
*** Finished ***
 THR = posiljka[sizeof(posiljka)/sizeof(posiljka[0])];