一个程序在不同的编译器上的行为会不同吗?

PO_*_*PO_ 0 c arrays

 #include<stdio.h>
 int main(){
    char a[] = {80, 65, 84, 84, 69, 82, 78};
    int i;
    for( i = 0; a[i]; ++i){
        printf("%c", a[i]);
    }
    //printf("%s", a); 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我认为这个程序应该抛出一个运行时错误,是的,当我运行 leetcode online IDE 时它确实如此,但是当我运行 Codechef IDE 时它打印了 PATTERN。
请解释一下,这里发生了什么?
谢谢你

Jon*_*art 6

我认为这个程序应该抛出一个运行时错误

C语言没有定义这样的东西。

for( i = 0; a[i]; ++i){
Run Code Online (Sandbox Code Playgroud)

此循环在a数组的第一个零值元素处终止。然而,没有这样的元素。因此,您超出了a数组,导致未定义行为。

printf("%s", a); 
Run Code Online (Sandbox Code Playgroud)

同样在这里。该%s说明符需要一个NULL结尾的字符数组(即“C-串”),但你给它的阵列是不是NUL结尾。这会导致未定义行为。

当您调用未定义行为时,任何事情都可能发生,包括编译器、机器、月相等之间的不同行为。

您有两种方法可以修复这个损坏的程序:

  1. 最后a用一个0元素终止你的数组。
    char a[] = {80, 65, 84, 84, 69, 82, 78, 0};
Run Code Online (Sandbox Code Playgroud)
  1. 将您的程序更改为不期望以 NUL 结尾的数组,并改为使用长度限制。
#include<stdio.h>
 int main(){
    char a[] = {80, 65, 84, 84, 69, 82, 78};
    int alen = sizeof(a)/sizeof(a[0]);
    int i;
    for( i = 0; i < alen; ++i){
        printf("%c", a[i]);
    }
    printf("%.*s", alen, a); 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)