程序的内存分配

一个由C/C++编译的程序占用的内存分为以下几个部分

1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其

操作方式类似于数据结构中的栈。

2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回

收 。

3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的

全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另

一块区域。 - 程序结束后由系统释放。

4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放

5、程序代码区—存放函数体的二进制代码。

二、例子程序  
//main.cpp

int a = 0; 全局初始化区

char *p1; 全局未初始化区

main()  
{

int b; 栈

char s[] = "abc"; 栈

char *p2; 栈

char *p3 = "123456"; 123456\0在常量区,p3在栈上。

static int c =0; 全局(静态)初始化区

p1 = (char *)malloc(10);

p2 = (char *)malloc(20);

分配得来得10和20字节的区域就在堆区。 

strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"

优化成一个地方。 

}  

数组不是基本类型,不能直接参与比较,数组与字符串及字符指针与字符串比较其实比较的是二者的地址。

例:

int isequiv(char *t)
{
if (t == "char")
return 1;
else
return 0;
}

int main()
{
char test[] = "char";
char *temp = "char";
printf("%d", isequiv(test));//输出 0
printf("%d", isequiv(temp));//输出 1
return 0;
}

那么为甚么test与temp同字符串“char”比较时结果会不一样呢?其实t=="char"比较的是地址!

首先,当你这么引用一个字符串的时候 "char",它表示存储在程序的常量区的一串字符串,它返回的就是这个常量区的字符串地址比如假设这个地址是 0x004038b0 "char",那么当你使用 char *temp = "char";的时候,temp就得到了这个常量字符串的地址,也就是temp等于 0x004038b0  
或许你可以试试

char* p1 = "char";
char* p2 = "char";
char* p3 = "char";
char* p4 = "char";

这里的 p1 p2 p3 p4 的值都一样,都是指向常量区字符串 "char", 比如上面的 0x004038b0  
然而当你这么只用的时候 
char test[] = "char";  
这里情况就和上面的不一样了,这样写的时候,编译器并不是让test也指向常量区的字符串"char",而是在本地堆栈分配了一段和"char"一样大的空间,如何把常量区字符串"char" 拷贝到test
 
可以这么理解
char* p1 = "char"; p1 和 常量区的"char"是同一个东西,地址相同
char test[] = "char"; test和 常量区的"char"不是同一个东西,但是内容相同
 

int isequiv(char *t)
{
if (t == "char")
return 1;
else
return 0;
}

以上面为例子
 
当你这么比较的时候  if (t == "char") 编译器是去比较t和"char"是不是同一个东西,它们的值(字符串的地址)是不是一样,而不是比较它们的内容是不是一样
 由前面的讲解可以知道
char* p1 = "char";    p1 和"char"的值是一样的
char test[] = "char";  test 和 "char"的值不一样,只是它们指向的字符串内容一样而已
 要比较两个字符串的内容是不是一样,用 strcmp()返回0就是一样
 比如,你那个函数可以改为

int isequiv(char *t)
{
if (strcmp(t, "char") == 0)
return 1;
else
return 0;
}

ps:你要理解两个感念,
 
同一个东西
内容相同的两个东西

注:字符串比较用用strcmp()函数,strcmp(test,"char")及strcmp(temp,"char")!

char *s 与 char s[ ]的区别的更多相关文章

  1. C/C++ char* arr与char arr[]的区别(反汇编解析)

    写作日期:2016.08.31 修改日期:2016.09.01 .2016.09.02. 交流qq:992591601 用了几天时间复习了下C语言.对于C语言的字符串操作有些不习惯,于是作为练习,写下 ...

  2. 初始化char指针--赋值和strcpy() 本质区别【转】

    原文地址:http://hi.baidu.com/todaygoodhj/item/0500b341bf2832e3bdf45180 使用常量字符串初始化char指针,或者使用strcpy复制,从语法 ...

  3. char *c和char c[]区别

    char *c和char c[]区别 问题引入:在实习过程中发现了一个以前一直默认的错误,同样char *c = "abc"和char c[]="abc",前者 ...

  4. char,wchar_t,WCHAR,TCHAR,ACHAR的区别----LPCTSTR

    转自http://blog.chinaunix.net/uid-7608308-id-2048125.html 简介:这是DWORD及LPCTSTR类型的了解的详细页面,介绍了和类,有关的知识,加入收 ...

  5. char[]数组与char *指针的区别

    char[]数组与char *指针的区别 问题描述 虽然很久之前有看过关于char指针和char数组的区别,但是当时没有系统的整理,到现在频繁遇到,在string,char[], char *中迷失了 ...

  6. SQLServer 之 char、varchar、nvarchar的区别

    一.定义 1.char char是定长的,也就是当你输入的字符小于你指定的数目时,它会再后面补空值.当你输入的字符大于指定的数时,它会截取超出的字符. 例如:char(8),最多可输入4个汉字或者8个 ...

  7. char 与 unsigned char的本质区别

    在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed) char与unsigned char之间的区别 首先在内存中,char与unsigned char没有什么不同 ...

  8. MySQL中char、varchar和text的区别

    三者空间占用方面: char:存储定长数据很方便,CHAR字段上的索引效率极高,可以有默认值,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间(自动用空格填 ...

  9. 【转】char *str 和 char str[]的区别

    char str[] = "abcd";定义了一个局部字符数组,返回它的地址肯定是一个已经释放了的空间的地址. 此函数返回的是内部一个局部字符数组str的地址,且函数调用完毕后 此 ...

  10. char str[] 与 char *str的区别详细解析

    char* get_str(void) { char str[] = {"abcd"}; return str; } char str[] = {"abcd"} ...

随机推荐

  1. Tessaract 源码分析(转)

    源码分析 Page Layout 分析步骤 二值化算法: OTSU调用栈:main[api/tesseractmain.cpp] -> TessBaseAPI::ProcessPages[api ...

  2. 设计模式之UML类图六大关系辨析【2】

    六大关系:继承(extends).实现(Realization).依赖(use-a).关联(association).聚合(has-a).组合(强聚合)(Composition). 类与类之间的强弱关 ...

  3. python技巧 switch case语句

    不同于C语言和SHELL,python中没有switch case语句,关于为什么没有,官方的解释是这样的 使用Python模拟实现的方法: def switch_if(fun, x, y):    ...

  4. window.location详解

    window.location对象常用属性 location.hostname 返回 web 主机的域名 location.host 返回 web 主机的域名(包含端口) location.pathn ...

  5. jQuery - 几种异步提交方式

    $.post(url,params,callback); $.post("${ctx}/role/grant", {userId : $("#userId"). ...

  6. mysql 5.7 ~ 新特性

    mysql 5.7特性 简介:mysql 5.7内存和线程性能方面的优化一 细节优化 参数:  1 innodb_buffer_pool    改进 innodb_buffer_pool可以动态扩大, ...

  7. octomap 安装使用

    由于工程实践中需要对机器人地图进行概率化估计并表示,故引入OctoMap库. 本文将介绍如何在Ubuntu环境下安装OctoMap. 如果你安装了ROS,那么一下的安装过程很可能会出错. 首先应该检查 ...

  8. C++读写TXT文件中的string或者int型数据以及string流的用法

    对文件的读写操作是我们在做项目时经常用到的,在网上看了很多博客,结合自身的项目经验总结了一下,因此写了这篇博客,有些地方可能直接从别的博客中复制过来,但是都会注明出处. 一.文件的输入输出 fstre ...

  9. 【转】Python中的字符串与字符编码

    [转]Python中的字符串与字符编码 本节内容: 前言 相关概念 Python中的默认编码 Python2与Python3中对字符串的支持 字符编码转换 一.前言 Python中的字符编码是个老生常 ...

  10. 硬盘SMART参数解释

    Raw Read Error Rate           底层读取错误率,高值暗示盘体/磁头有问题 Throughput Performance        读写通量性能 (越高越好)      ...