C语言数据在内存的存放问题

char str[]
const char str[]
char *str
const char *str
以上4者的区别?在内存中的存放是怎样的(静态数据区、堆、。。。。。)
如果还有其他情况的,请补充,谢谢!

对于char str[]和const char str[],它们是字符串数组,为字符串内容分配的内存根据数组变量的作用域(在哪里定义的)有所不同,如果在函数内部定义(也就是局部变量),存放在栈中,如果在全局定义,放在静态数据区中。
对于char *str和const char *str,它们是字符串指针,对于指针变量本身也是根据作用域不同放在栈或静态数据区,但我们这里显然要考察的是指针所指向字符串存放的位置。
对于const char *str,由于它是常量字符串的指针,它所指向的字符串必须在编写程序时已经指定,而且不能修改。例如const char *str="Hello World!","Hello World!"这个字符串存放于文字常量区,而指针str的值则为第一个字符所在的内存地址。
对于char *str,使用方法比较灵活,既可以在程序代码中令其指向一个常量字符串,比如char *str="Hello World!",这个字符串存放在文字常量区;也可以在程序运行中为str指针动态分配内存,比如str = malloc(sizeof(char)*10);这个动态的内存是在堆中的,那么为它拷贝字符串以及其他各种字符串操作都是在堆中进行。追问

void const_char(const char *str),这里的const char *str呢?

追答

函数对传入的参数的地址是没有要求的,可以是进程可用内存的任何地方,堆、栈、未初始化静态数据区、初始化静态数据区、文字常量区,全都可以,具体位置根据你传入的实参而定。

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-09-14
1和3都是变量存放的区域就是由编译器帮你分配的栈区
2和4是常量的定义存放的区域是放在全局静态区,一般定义了static类型的数据也放在这个区域
还有就是堆区由程序员来定义,当程序员向内存申请空间的时候分配的
1和3的区别在于1是把整组里面的元素都是放在栈区,3 是把指针的地址放在栈区而指针指向的内 容则放在常量区的
第2个回答  2012-09-14
首先这个并不是c语言的规定,而只是编译器作者,管理内存的一种策略。

const char str[]
const char *str
由编译器 指定和初始化,在静态区 且只读

char *str
char str[]
分两种情况 1.若是全局变量或者静态变量 则在静态区 且根据其是否初始化分为 bss段和data段
2.若是局部变量则并不存储,而是当代码运行到的时候在堆栈中生成,并释放
堆,是指由malloc等申请的空间所在的内存,在这些空间中存储的就是存在堆中的,由程序自己负责释放和分配
还有一种字符串字面量一般有一个只读的内存区域用来存放
参考如下代码及注释,
int a = 0; 全局初始化区
char *p1; 全局未初始化区
const int g=10; 常量区
main()
{
const int h=1; 栈
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所指向的"12345
6"优化成一块。
}
第3个回答  2012-09-14
1和3一样,2和4一样
第4个回答  2012-09-14
1和3一样在静态数据区,2和4一样,

c语言数据类型的数据在内存中如何存储?
(1)共同体在内存中共用一块存储空间,(2)空间的大小由共同体中占用空间最大的变量所决定 (3)输出时,按相应的类型进行数值解析。int 占4个字节 char 占一个字节 double占8个字节 所以data所占空间为8字节。data.a=5;在内存中存储的是二进制格式,X86机器上,低位在前形如:00000101 0000000...

C语言数据在内存的存放问题
对于char str[]和const char str[],它们是字符串数组,为字符串内容分配的内存根据数组变量的作用域(在哪里定义的)有所不同,如果在函数内部定义(也就是局部变量),存放在栈中,如果在全局定义,放在静态数据区中。对于char *str和const char *str,它们是字符串指针,对于指针变量本身也是根据作...

C语言的基本类型在内存中怎么储存的?
1、整型数据:所有整数(正负零)在内存中都是以补码的形式存在。对于一个正整数来说,它的补码就是它的原码本身。对于一个负整数来说,它的补码为原码取反再加1。2、字符型数据:把字符的相对应的ASCII码(整数,映射关系见ASCII码表)放到存储码单元中,而这些ASCII代码值在计算机中同样以二进制补码...

c语言中字符型数据在内存中的存储形式
ASCII码表示、字节存储。2、ASCII码表示:每个字符在计算机中都有对应的ASCII码值,用来表示不同的字符,wchart类型的字符则使用Unicode编码。2、字节存储:字符类型占用一个字节(8位)的存储空间。这意味着每个字符都可以用8位二进制数来表示。最低位存储字符的实际值,而其他位用于特殊的控制字符或其他...

C语言中常量在内存中的存储形式怎么表示
2、char型常量(字符),在计算机中是按其ASCII值进行存储,ASCII是"整型类"数据,在内存中全部以补码形式进行存放。补码是一种二进制数据表示形式。整数分为正数、负数和零,计算机设计初期,规定,以字节的最高位表示符号,其余位表示数值,来表示有符号数据,这就是原码。但原码表示法中出现了”正0“...

c语言中字符型数据在内存中的存储形式
ASCII码的形式。在C语言中,字符型数据(char类型)在内存中的存储形式是以ASCII码的形式存储。每个字符都对应一个ASCII码值,范围是0到127。ASCII码是一种字符编码标准,用来表示键盘上的字符和控制字符。

C语言数据存放的顺序是如何确定的?
最后的数据在栈顶,从栈顶到栈底来看的话 数据的存储就是逆序的 如果从数组下标来看的话就是顺序的 这里我们可以将指针反转过来 include <stdio.h>#define PUSH(i) (*p=i,--p)#define POP(i) (++p,i=*p)int main(int argc,char **argv){ int a[11]; int i,r; int *p=a...

为什么在c语言中字符型数据在内存中不能以BCD码形式存放
字符也是个整型,可能不如用补码形式存储简单直观好运算吧?电路也好设计一些,用BCD码格式存储还要把加减结果做另外处理,而且不太好处理,所以计算机都采用了补码格式存储整型数据,BCD码虽然能节省很多空间,但计算时间效率上不如补码快,另外补码,BCD码,非BCD码格式不一样,需要转换 ...

在c语言中,字符型数据在内存中以什么形式存放
c的char数据属于基本类型,基本类型其中还包括-整型,实型,枚举类型!数据在内存中是以二进制形式存放的。数值是以补码表示的。整型:一个正数的补码和其原码的形式相同。而负数的补码方式是将其绝对值的二进制形式“按位求反再加1”实型:在内存中占4个字节,是按照指数形式存储的,实型数据分为...

c语言数组在内存中是怎么分配的
使用C语言编程,实际上使用的内存只有一种虚拟内存。根据功能的不同在C语言中又将虚拟内存为分三类:栈区、堆区、静态数据区,无论单一变量还是数组,其内存分配都是如此;1、栈区:一般每一个函数对应一个栈区,在编译原理中称为栈帧;2、静态数据区:这实际上对应于生成的可执行文件的data区段,...

相似回答
大家正在搜