字符串常量指针问题

采用指针存储字符串,其实质就是把字符串的首地值附给基类型为char的指针变量,从而可以从字符串首元素开始对字符串进行操作,这里面也存在一点问题.

用这个类子给大家解释解释.

int main()
{
char *p="hello world";
p[0]=‘H‘;
printf("%s\n",p);
return 0;
}
运行结果会出现断错误,原因在于,*p="hello world" 这句仅仅声明了一个指针变量,指向字符串"hello world",而"hello world"这个字符串程序没有给它分配空间,编译器把它分配到常量区.而常量字符串的值是不允许被修改的 ,所以会出现断错误.

程序改为如下就正确了
int main()
{
char p[12]="hello world";
char *p1=p;
p1[0]=‘H‘;
printf("%s\n",p1);
return 0;
}

原因在于,p[12]="hello world"是你自己定义的一个长度为12 的字符数组,所以字符串"hello world"编译器会给它分配空间(在栈中),所以你能修改它的值.

时间: 2024-10-08 00:16:07

字符串常量指针问题的相关文章

字符串的基本操作,初始化和赋值之类的区别,和数据名是一个常量指针不可以改变和赋值(盲点众多)

#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <string.h> #include <stdio.h> //一级指针的典型用法 //数组 int a[10] //字符串 //1 C语言的字符串 以零结尾的字符串 //2 在C语言中没有字符串类型 通过字符数组 来模拟字符串 //3 字符串的内存分配 堆上 栈上 全局区 (很重要) //字符数组 初始化 void main51() { //1 指

指针和字符串和字符串常量、用gdb来获取非法内存中的信息

例程1 #include<stdio.h> int main(void) { char *s="hello"; printf("%s\n", s); s[0]="H" //因为s指针指向的字符串"hello"是字符串常量,所以不能通过指针进行更改,所以这里会产生段错误 printf("%s\n", s); return 0; } 例程2 #include<stdio.h> #incl

返回“字符串常量的指针”和“返回数组名”的区别

char*getmemory(void) { char p[]=”hello world”; return p; } void test(void) { char *str=NULL; str=getmemory(); printf(str); } 问:运行Test 函数会有什么样的结果? 由于数组p是栈上数据,返回数组名就是返回栈内存即动态数据区的地址,函数结束会被释放,所以返回的地址也就指向了不确定的位置了,str就成了乱码! 如果改成: char*getmemory(void) { cha

指针和字符串常量

指针和字符串常量 首先比较两段代码 代码1 char ch1[] = "hello"; *ch1 = 'H'; //OK ch1[0] = 'H'; //OK printf("%s\r\n",ch1); 代码2 char *ch2 = "world"; *ch2 = 'W'; //运行时错误 ch2[0] = 'W'; //运行时错误 printf("%s\r\n",ch2); 这里的"world"是字符串

字符数组,字符指针,字符串常量,以及sizeof的一些总结

1.以字符串形式出现的,编译器都会为该字符串自动添加一个\0作为结尾 如在代码中写"abc",编译器帮你存储的是"abc\0". 2.数组的类型是由该数组所存放的东西的类型以及数组本身的大小决定的,如char s1[3]和char s2[4],s1的类型就是char[3],s2的类型就是char[4] 字符串常量的类型可以理解为相应字符常量数组的类型,如"abc"的类型可以看成是const char[4] 3.字符数组和指针的区别 (1)把&qu

字符串常量强制转换为字符指针

一.实验代码 #include <stdio.h> void print(char s[]); int main() { print((char *)"abcdef"); return 0; } void print(char s[]) { printf("%s\n",s); } 二.实验结果 输出:abcdef 三.调试现象 三.结论 字符串常量强制转换为字符指针,是将字符串常量的地址作为这个指针值.至于这个常量的位置还不太确定.

字符串常量与 字符指针,字符数组

1. 字符串的定义(1) char buf[10] = "hello"; //定义了10个字节的数组,但只用了6个字节存放字符串(2) char *str = "hello"; //此处hello是字符串常量,存储在长常量区,把首地址传给指针变量 sts(3) char *s = "hello"; // 指针s 与 指针str的内容都是指向字符串常量“hello” 其值相等:(4) char buff[] = "hello";

字符串常量初始化指针

今天写个小文说一说字符串地址和字符串常量. 在C/C++中,一个字符串常量表示的是该字符串第一个元素的地址,就跟char指针名,char数组名表示的是字符串第一个元素的地址一样. 想要打印一个地址,用一个简单的 cout << 地址; 语句就可以搞定: 但是下面这两条语句将打印整个字符串 char a[20] = "1234"; cout << a << endl; char *p = a; cout << p << endl

字符型指针与字符串常量

字符串常量在编译时系统给定存储位置,可以赋值给字符指针:此时可以通过下标进行访问,但不可以通过下标修改字符串的值. 字符指针指向字符数组时可以修改字符串的值. #include <stdio.h> #include <string.h> int main() { char a[26]; char *b = "abc"; //定义时初始化 b="123"; //可以被重新赋值 //b[1] = 'v'; //不可以被修改 a[1] = b[1]