-5

我刚提出一个问题,当我在 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;
}

A、爱丽丝

B.ecilA

C. Alice lice ice ce e

D. 虱子冰

4

5 回答 5

8

那个代码看起来不对。线

*x = x[n];

尝试写入字符串字面量"Alice"。无法修改字符串文字,因此这会导致未定义的行为。崩溃(正如我认为您所看到的)在这里是有效且预期的结果。

要回答您的问题,程序的输出是未定义的。不太可能给出您建议的任何结果。

如果您将声明更改x

char s[]="Alice";
char* x = s;

然后

*x = x[n];

将用它的空终止符替换第一个字符x,这意味着printf循环将输出lice ice ce e(您选择的选项 D)

于 2013-05-15T08:09:53.650 回答
5

程序的输出是什么?

一些不确定的东西,它甚至可能崩溃。在这条线上:

*x = x[n];

您正在修改字符串文字,因此您的程序会调用未定义的行为。

但是,如果您修改代码以使 UB 消失(例如,您使用字符串初始化数组,而不是仅使用指向字符串字面量的指针,并获得指向该数组第一个元素的指针),那么它将是lice ice ce e

于 2013-05-15T08:09:50.253 回答
2

改变:

char *x="Alice";

char str[] = "Alice";
char *x=str;

你会得到D

于 2013-05-15T08:11:17.087 回答
2
char *x="Alice";
n = strlen(x);
*x = x[n];

在大多数系统上,“Alice”将存储在只读存储器中,并且 x 将被设置为指向它。当您执行 *x = x[n] 时,您将尝试更改该只读内存的值,因此您的程序将在此时退出并出现错误。

于 2013-05-15T08:09:40.407 回答
0

简短的回答:输出主要是段错误。

解释:x 指向一个常量字符串——“Alice”。& 您正在尝试修改 *x。

于 2013-05-15T08:11:09.477 回答