C语言数据在内存的存放问题
charstr[]constcharstr[]char*strconstchar*str以上4者的区别?在内存中的存放是怎样的(静态数据区、堆、。。。。。)如果还有其他情...
char str[]
const char str[]
char *str
const char *str
以上4者的区别?在内存中的存放是怎样的(静态数据区、堆、。。。。。)
如果还有其他情况的,请补充,谢谢! 展开
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);这个动态的内存是在堆中的,那么为它拷贝字符串以及其他各种字符串操作都是在堆中进行。
对于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和3都是变量存放的区域就是由编译器帮你分配的栈区
2和4是常量的定义存放的区域是放在全局静态区,一般定义了static类型的数据也放在这个区域
还有就是堆区由程序员来定义,当程序员向内存申请空间的时候分配的
1和3的区别在于1是把整组里面的元素都是放在栈区,3 是把指针的地址放在栈区而指针指向的内 容则放在常量区的
2和4是常量的定义存放的区域是放在全局静态区,一般定义了static类型的数据也放在这个区域
还有就是堆区由程序员来定义,当程序员向内存申请空间的时候分配的
1和3的区别在于1是把整组里面的元素都是放在栈区,3 是把指针的地址放在栈区而指针指向的内 容则放在常量区的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先这个并不是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"优化成一块。
}
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"优化成一块。
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1和3一样,2和4一样
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1和3一样在静态数据区,2和4一样,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询