C 解引用指针

C 解引用指针,c,pointers,C,Pointers,我只是提出了一个问题,当我编译并在代码块中运行它时,我得到了一个错误,我无法运行它 问题是 程序的输出是什么 #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++; }

我只是提出了一个问题,当我编译并在代码块中运行它时,我得到了一个错误,我无法运行它

问题是

程序的输出是什么

#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.爱丽丝

埃西拉

C.爱丽丝虱子

D.虱子

char *x="Alice";
n = strlen(x);
*x = x[n];
在大多数系统上,Alice将存储在只读存储器中,x将被设置为指向它。 当您执行*x=x[n]时,您将尝试更改只读内存的值,以便您的程序在该点退出时出错

程序的输出是什么

不确定的东西,它甚至可能崩溃。在这一行:

*x = x[n];
您正在修改字符串文字,因此程序调用未定义的行为


但是,如果您修改代码使UB消失,例如,您使用字符串初始化数组,而不是仅使用指向字符串文字的指针,并获得指向该数组的第一个元素的指针,则代码看起来是错误的。线路

*x = x[n];
尝试写入字符串文本Alice。无法修改字符串文字,因此这会导致未定义的行为。我认为你们看到的崩溃是一个合理的预期结果

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

如果您将x的声明更改为

然后


将用其空终止符替换x的第一个字符,这意味着printf循环将从您的选择中输出许可证选项D。简短回答:输出将主要是seg fault

解释:x指向一个常量字符串-Alice.&您正试图修改*x.

更改:

char *x="Alice";



你会得到D

可能是你想要告诉你的错误…我有一个错误,我无法运行它。。始终包含错误消息,即使它们对您来说很神秘。我知道错误意味着什么,但那不是编译器错误。这个错误来自我的OSWindows7,说程序无法运行,那么问题可能不在代码中。您需要详细说明这个问题,包括您发出的命令、您在哪些文件夹中工作,以及您可能需要检查文件权限。你要的不是你的真命天子question@simonc是的,确实如此,我忽略了…>。如果在保留参数的情况下耗尽了格式,则会一如既往地计算多余的参数,但会忽略其他参数。向printf等传递比格式要求更多的参数是无害的,只有太少的参数或与转换说明符invoke UB不匹配的参数。@danielfisher谢谢。然后,我将删除错误的部分,我想知道,在实践中,它如何不会导致堆栈损坏?@H2CO3在C实现中,调用方负责清理堆栈,而不是被调用的函数。调用者总是知道它在堆栈上放了多少个参数,因此知道要去掉多少参数。@JeremyP很高兴知道,而且看起来确实合理。现在我必须使用我的编译器…不,如果您将x的声明更改为char x[],那么您将得到一个编译器错误。谢谢,但是数组和指针之间的区别是什么?数组不也是指针吗?@ahmadrezamostajabi不,@H2CO3谢谢,我忘了函数后面的指针算法。现在更正了。@ahmadreza mostajabi也看看这个@Rüppell's文化不,它不是。@Rüppell's文化我在堆栈上分配字符串,而不是数据segment@R吕佩尔的文化是的,这两者在概念上都更好/正确。@R吕佩尔的文化在句法上是的,但在语义上不是。在correct下面,我指的是语法和语义上的正确。看,如果有一个计算素数的程序,它编译的程序语法正确,但输出的是非素数,那么它在语义上是错误的,你会称这个程序正确吗?@Rüppell's culture,你永远不会足够小心。如果你依赖这个D'oh,我不会忘记这一点,我知道,我不想安全,所以让我们愚弄编译器,然后有一天你会忘记它,你的代码会严重崩溃。你没有提到正确术语支持的确切原因-对OP的环境做出假设是好的,甚至可能是合理的,但这是不正确的。
*x = x[n];
char *x="Alice";
char str[] = "Alice";
char *x=str;