知方号

知方号

char *name 与 char name[]的区别(基础知识)

在 学习过程中发现了一个以前一直默认的错误,同样char *c = "abc"和char c[]="abc",前者改变其内容程序是会崩溃的,而后者完全正确。 程序演示: 测试环境Devc++ 代码 #include  #include < string.h> main() {     char *c1 = "abc";     char c2[] = "abc";     char *c3 = (  char* )malloc(3);     c3 = "abc";     printf("%d %d %s ",&c1,c1,c1);     printf("%d %d %s ",&c2,c2,c2);     printf("%d %d %s ",&c3,c3,c3);     getchar(); }   

运行结果 2293628 4199056 abc 2293624 2293624 abc 2293620 4199056 abc

参考资料: 首先要搞清楚编译程序占用的内存的分区形式: 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。 4、文字常量区—常量字符串就是放在这里的。程序结束后由系统释放。 5、程序代码区 这是一个前辈写的,非常详细 //main.cpp  

#include  #include < string.h>    int a=0;     // 全局初始化区    char *p1;    // 全局未初始化区    main()   {     int b;栈     char s[]="abc";    // 栈     char *p2;          // 栈     char *p3="123456";    // 123456

二、堆和栈的理论知识 2.1申请方式 stack: 由系统自动分配。例如,

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。