char*str与char str[]的差异。
来源:互联网 发布:高中生物知乎 编辑:程序博客网 时间:2024/06/05 22:51
下面是几个错的例子:
1
# include <stdio.h>int main(void){char *str;scanf("%s",str); //errorreturn 0;}
# include <stdio.h>int main(void){char *str;gets(str); //errorreturn 0;}
3
# include <stdio.h># include <stdlib.h>int main(int argc,char* argv[]){FILE*fp=NULL;char*str;if((fp=fopen(argv[1],"r"))==NULL){printf("file open error!\n");exit(1);}fgets(str,4,fp); //errorfclose(fp);fp=NULL;puts(str);return 0;}
归纳:
上面的程序都有一个共同点,那就是试图从流中读取一个字符串放到str中。这3个程序都是错误的。
为什么不可以这样?
答:定义的str字符指针,他的值对应的内存空间是不确定的,或者说它的空间是不可用的,就好比int a;
此时的a是一个不可预测的垃圾值一样,把a拿来直接用不能达到我们的目的,那么我们就可以为a赋值,
在来利用a。同样,要想把str变的可用,可以用malloc(或者calloc)为其申请一块一定大小的内存给他,就OK了。
当然,如果你只给str申请了 2个字节的空间,而你却把5个字节大小的字符串放进去,这又是另一种错误,
叫越界。
所以,上面的3个程序,加上:str=(char*)malloc(sizeof(char)*n)
引申:(下面的程序也是同样的错误)
# include <stdio.h>int main(void){int *p; *p=5; //errorreturn 0;}
# include <stdio.h>int main(void){char *p;*p='a';return 0;}
总结:
定义的指针变量是不能直接拿来存放数据的,它没有有效的空间,使用前应为其动态分配内存等方法,
让他指向有效内存空间
引用:Stephen Prata 著 《C prime plus 》P263
“ 切记:当创建一个指针的时候,系统只分配了用来存储指针本身的内存空间,并不分配存储数据的内存空间
因此在使用指针变量之前,必须给它赋予一个已分配的内存地址。”
另一个问题:
问:为什么把char*str换成char str[10];这样也可以避免上述的错误呢?
答:此时是把str定义为一个长度为10的数组,那么,str这个数组从一定义就拥有10个字节的内存空间,
他可以指向对应长度的字符数组,无需为其分配空间。
总结:
通过指针去存放数据,要保证这个指针指向有效空间。
另外,char*str=“i am a boy” 与char str[6]="i am a boy" 的区别
1:char*str=“i am a boy”
说明:str在栈里,他是一个指针变量,本身也占用内存,但是他不支配有效内存空间。“i am a boy”是一个常量,
他在静态储存区。
=号的意义是:把“i am a boy”这个数组常量的首地址赋值给str(初始化str),这样str就指向字符数组了。
2:char str[]="i am a boy"
说明:str[6]="i am a boy" 整个都在栈里,他相当于:str[6]={ ' i ' , ' ' , 'a' , ' m' ,' ', 'a' ,'b' ,'o' ,'y'}。
str本身支配11个字节的空间。
最后:再上2个图,说明栈区和常量区的区别
个人心得,有错欢迎提出。
- char*str与char str[]的差异。
- char str[]与char *str的区别
- char str[]与char *str的区别
- char str[]与char *str的区别
- char str[]与char *str的区别
- char str[]与char *str的区别
- char str[]与char *str的区别
- char *str 与char str[] 的区别
- char*str与char str[]
- 对char str*与char str[]的深入理解
- C++中char* str与char str[]的区别
- char str[] 与 char *str的区别详细解析
- 浅谈char *str与char str[]的区别
- 关于char *str[]与 char str[]的区别
- char str[] 与 char *str的区别详细解析
- C++ char* str与char str[]
- char *str和char str[]的区别
- char str[] 和 char *str 的区别
- OC-Runtime
- openwrt 编译
- 黑客成长之路图
- android 框架volley安装及使用
- Placement new 存在的理由
- char*str与char str[]的差异。
- poj_2531
- string存入char数组,空格问题
- [译]【Storm入门指南】第三章 Topologies
- 黑马程序员一NSNumber, NSDate,NSValue
- Android问题】解决 Android SDK下载和更新失败“Connection to https://dl-ssl.google.com refused...
- [Leetcode]Populating Next Right Pointers in Each NodeI&II
- poj 3278 Catch That Cow 【bfs】
- C语言矩阵算法集合