我刚刚提出了一个问题,当我在CodeBlockes中编译并运行它时,我收到了一个错误,我无法运行它。
这是一个问题。
该计划的输出是什么?
#include<stdio.h>
#include<string.h>
int main(){
int i, n;
char *x="Alice";
n = strlen(x);
*x = x[n];
for(i=0; i<=n; i++){
printf("%s ", x);
x++;
}
printf("\n", x);
return 0;
}
一个。爱丽丝
B中。 ecilA
℃。 Alice lice ice ce e
d。虱子冰雹
答案 0 :(得分:8)
该代码看起来不对。这条线
*x = x[n];
尝试写入字符串文字"Alice"
。无法修改字符串文字,因此会导致未定义的行为。崩溃(我认为你正在看到)是一个有效的预期结果。
要回答您的问题,程序的输出是未定义的。它不太可能给出您建议的任何结果。
如果您将x
的声明更改为
char s[]="Alice";
char* x = s;
然后
*x = x[n];
将使用空终止符替换x
的第一个字符,这意味着printf
循环将输出lice ice ce e
(选项中的选项D)
答案 1 :(得分:5)
该计划的输出是什么?
有些东西不确定,甚至可能会崩溃。在这一行:
*x = x[n];
您修改字符串文字,以便您的程序调用未定义的行为。
但是,如果您修改代码以便UB消失(例如,使用字符串初始化数组而不是仅使用指向字符串文字的指针,那么您将得到一个指向该数组的第一个元素的指针),然后它将是lice ice ce e
。
答案 2 :(得分:2)
char *x="Alice";
n = strlen(x);
*x = x[n];
在大多数系统中,“Alice”将存储在只读存储器中,x将被设置为指向它。 当您执行* x = x [n]时,您将尝试更改该只读内存的值,以便程序在此时退出并显示错误。
答案 3 :(得分:2)
变化:
char *x="Alice";
要
char str[] = "Alice";
char *x=str;
您将获得D
答案 4 :(得分:0)
简短回答:输出主要是段错误。
解释:x指向一个const字符串 - “Alice”。 &安培;你正试图修改* x。