取消引用指针

时间:2013-05-15 08:07:45

标签: c pointers

我刚刚提出了一个问题,当我在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。虱子冰雹

5 个答案:

答案 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。