指针指向常量的结果!
来源:互联网 发布:bring with it的it 编辑:程序博客网 时间:2024/05/15 07:08
先看一个东西,
char *w;
w=(char *)malloc(20);
w="asdddddd";
printf("s=%s",w);
free(w);
malloc这个语句是没有效果的,他给w在栈中分配了20个字节,但是下一句就变了w的指向,就是“asdddddd
”的首地址。而字符串指针本来就可以直接指一个字符串的首地址。没有问题也不会出错1
这个很简单,但是在w指向asdddddd之后,就只可以读而不可以写了,因为像22,或者“adf”这种变量所在的地址是不属于指针的,因此是不可以写的。
比如:
char *str1=(char *)malloc(sizeof(char)*100);
str1="123456789";
puts(str1);
char *str2=(char *)malloc(sizeof(char)*100);
str2="abcdefg";
puts(str2);
strcpy(str2,str1);
puts(str1);
puts(str2);
这样写一个不属于指针的地址,自然就出错了。
在编程语言中,数据分为常量和变量,常量是只读的,变量是可读、可修改赋值的。char *StrConst= "123456789"; 是字符串常量,而数组char StrArray[]="123456789";是定义了一个字符串变量。不同的操作系统、不同的编译器对于常量和变量的处理措施是允许进行进行特有的优化、保护的。
解决方法,如上面的分析,可以用数组代替:
char *str1=(char *)malloc(sizeof(char)*100);
str1="123456789";
puts(str1);
char str3[100]="asdf";
strcpy(str3,str1);
puts(str1);
puts(str3);
这样是可以的。
还有就是定义一个字符串指针,分配地址(这一步必须的),之后就直接写入,不要让他再指向一个常量,这样他就是一个变量了,是可以写的。
char *str1=(char *)malloc(sizeof(char)*100);
str1="123456789";
puts(str1);
char *str2=(char *)malloc(sizeof(char)*100);
strcpy(str2,str1);
puts(str1);
puts(str2);
最后记得要free。
还有一个问题,就是在给指针分配一段地址空间以后,如果在指向一个常量,那么分配的空间是没有办法free的,可以看程序,他的运行结构就是异常。
int main(void)
{
char *str1=(char *)malloc(sizeof(char)*100);
str1="123456789";
puts(str1);
char *str2=(char *)malloc(sizeof(char)*100);
strcpy(str2,str1);
puts(str1);
puts(str2);
char *w;
w=(char *)malloc(20);
w="asdddddd";
printf("s=%s",w);
free(str1);
free(str1);
free(str2);
return 0;
}
当w和str1指向一个常量以后他们原来分配的空间就成了“无名地址”了,无法删除,free(w)和free(str1)都是要删了常量所指向的地址,常量也是不可以删除了,编译器会在常量作用完之后自己回收的,删除不了的!
- 指针指向常量的结果!
- 指向常量的指针常量
- 指向常量的指针
- 指向常量的指针
- 指向常量的指针
- 常量指针、指针常量、指向常量的常量指针
- 指针常量,常量指针。指向常量的常量指针
- 指针常量,常量指针, 指向常量的常量指针
- 指针常量,常量指针。指向常量的常量指针 收藏
- 常量指针、指针常量以及指向常量的指针常量
- 常量指针,指针常量,指向常量的指针常量
- 指针常量、常量指针、指向常量的指针常量
- 常量指针、指针常量、指向常量的指针常量
- 指向常量的指针 与 常量指针
- 指针与常量,指向常量的指针
- 指向常量的指针与指针常量
- 常量指针与指向常量的指针
- 指向常量的指针和指针常量
- 如何用VB建立数据库
- 2007透明加密一览(1)-企业为什么青睐透明加密?
- 2007透明加密一览(2) -透明加密原理和产品分类和关键评价指标
- 高质量C++/C编程指南 -- 第7章 内存管理
- ASP.NET技术的学习顺序问题
- 指针指向常量的结果!
- 2007透明加密一览(3)-选择透明加密产品的方法以及市场准入条件
- 如何编写一个shell脚本
- ADO.NET入门
- webControl 中使用资源 与嵌入资源
- ZT+YC 算法经典解释
- 在 ADO.NET 数据集中浏览多个相关表
- 如何能得到快乐
- 2007透明加密一览(4)-撰写中