其他分享
首页 > 其他分享> > C语言 字符串常量赋值给指针后不可修改原因分析

C语言 字符串常量赋值给指针后不可修改原因分析

作者:互联网

C语言 字符串常量赋值给指针后不可修改原因分析

/转载请说明出处与作者/

/作者:多巴胺dopamine/

一、问题描述

​ 字符串赋值给一个指针后,再次赋值的时候发现会报错。而将指针当作指针数组赋值时,却可以修改。

  char* a=(char*)malloc(sizeof(char)*5);
  char* b=(char*)malloc(sizeof(char)*5);
  a="ABC\0";
  b[0]='A';  b[1]='B';  b[2]='C';  b[3]='\0';  
  a[0]='E';
  b[0]='E';

二、分析

查看指针所指向的地址是否发生改变

  char* a=(char*)malloc(sizeof(char)*5);	char* b=(char*)malloc(sizeof(char)*5);
  char* d=(char*)malloc(sizeof(char)*5);	char* e=(char*)malloc(sizeof(char)*5);
	//打印地址
  printf("a:%d\n",&*a); printf("b:%d\n",&*b); printf("d:%d\n",&*d); printf("e:%d\n",&*e);
  printf("\n\n");
  a="ABC\0";		e="ABC\0";
  b[0]='A';  b[1]='B';  b[2]='C';  b[3]='\0';  
  char c[5]="ABC\0";
  d="ABCD\0";
	//赋值之后打印地址,查看是否发生变化
  printf("a:%d\n",&*a); printf("b:%d\n",&*b);printf("c:%d\n",&*c);printf("d:%d\n",&*d);printf("e:%d\n",&*e);
  printf("\n");
  c[0]='E';		printf("c:%s\n",c);

image

总结:

(1)发现将一个字符串常量赋值给指针后,指针所指向的地址改变了。a和e是两个指针变量,但是在使用相同的字符串常量赋值后,所指向的内存地址是一个。

(2)数组c可以修改,且地址空间离其它变量特别远。

​ 说明:数组c开辟的空间在堆栈里。

(3)

  a="ABC\0";d="ABCD\0";

​ a和d所指向的字符串仅仅差了一个字母,但地址紧邻却不同。

​ 说明:这是两个字符串常量,同时也说明说明:程序在初始化的时候仅会将该程序将使用的字符串常量放到一个区域(仅读不可修改)。

(4)b的地址没有改变。

​ 说明:b虽是指针变量,但赋值时采用数组的方式,因此它的地址空间也在堆栈里,可以修改。

三、结论

​ 在使用 malloc()为指针开辟空间时,开辟的空间都是指向堆栈里的空间。但如果用常量给其赋值,指针就会指向不可修改的常量区,但之前开辟的空间仍然存在。

标签:malloc,常量,C语言,char,printf,指针,赋值
来源: https://www.cnblogs.com/yourdopamine/p/16216420.html