C 警告-“;未定义的行为[-Waggressive循环优化]”;
我正在尝试使用C编程语言通过UART发送字符串。我通过将我的字符一个接一个地加载到THR寄存器中来实现这一点,如下所示: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[]
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
to14
是有效的索引。天哪。我忘记了基本内容…它从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])];