一个C语言中指针型字符数组的问题

char *p="AAA";
printf("%s",p);
p[0]='B';
p++;
printf("%s",p);
以上代码哪里有问题?具体分析。谢谢。
最新回答
「遺落的星星」

2025-03-02 05:14:20

char *p=“AAA”; //初始化一个指向字符串的指针(指向字符串其实是指向字符串的第一个字符)


注意,上面说的是指向字符串常量!


p[0]='B';    //不允许


这会导致内存访问错误。原因在于编译器可能选择内存中的同一个单个的拷贝,来表示所有相同的字符串文字。


给你举个例子:

char message1[] = “hello”;   //1式

char*message2 = “hello”;     //2式

两个hello有什么不同呢? 用于初始化一个字符数组时,它就是一个初始化列表。例如1式。在其他地方时,它都表示一个字符串常量。例如2式。


这两个初始化有不同的含义。前者初始化一个字符数组的元素,而后者是一个真正的字符串常量。这个指针变量被初始化为指向这个字符串常量的存储位置。


故你不能给一个常量赋值,C语言中,可以作为左值,也就是可以被赋值的不能为常量!


再深入一点儿,字符串常量属于静态存储(static)类。静态存储是指如果在一个函数中使用字符串常量,即使是多次调用了这个函数,该字符串在程序的整个运行过程中只存储一份。整个引号中的内容作为指向该字符串存储位置的指针。


故p[0]='B';   是不允许的。


可以修改为下:

#include <stdio.h>
int main()
{
    char str[]="AAA";
    char *p = str;
    printf("%s\n",p);
    p[0]='B';
    p++;
    printf("%s\n",p);
    return 0;
}
___臭屁不斷℡‘

2025-03-02 08:43:40

luxinmu1 的答案很有道理
第一行 p指向了只读的内存空间,
第二行打印 AAA
第三行对p指向的内存空间修改时会报段错误
假如忽略第三行,下面p++是可以的,然户会打印出 AA
鲜奶千层雪

2025-03-02 08:18:46

指针的定义和赋值 char *p;&p="AAA";printf("%s",*p);