#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。
请解释一下,这里发生了什么?
谢谢你
我认为这个程序应该抛出一个运行时错误
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结尾。这会导致未定义行为。
当您调用未定义行为时,任何事情都可能发生,包括编译器、机器、月相等之间的不同行为。
您有两种方法可以修复这个损坏的程序:
a用一个0元素终止你的数组。 char a[] = {80, 65, 84, 84, 69, 82, 78, 0};
Run Code Online (Sandbox Code Playgroud)
#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)