c指针存储单元

C语言 码拜 9年前 (2016-04-25) 1078次浏览
#include<stdio.h>
int main()
{
char *my_name = “Tony”;
int num = 5000;
char *me=”hello”;
my_name=me;
fprintf(stdout,”NAME=%s,NUM=%d,me=%s\n”,my_name,num,me);
return 0;
}
在本人以前的认知里,这里指针my_name和me都没有分配存储单元么?仅仅分配了一个指针的地址么?那这两个“tony”和“hello”是在常量区了?指针不需要给他malloc动态分配内存么?谢谢各位帮忙回答。
解决方案

40

my_name和me,原因是定义的是一个普通指针,并没有定义空间来存放”Tony”,所以编译器得帮我们找地方来放”Tony”,显然,把这里的”Tony”当成常量并把它放到程序的常量区是编译器最合适的选择。所以尽管my_name的类型不是const char*,并且my_name[0] = “x”;也能编译通过,但是执行my_name[0] = “x”;就会发生运行时异常,原因是这个语句试图去修改程序常量区中的东西。
记得哪本书中曾经说过char* my_name= “Tony”;这种写法原来在c++标准中是不允许的,但是原因是这种写法在c中实在是太多了,为了兼容c,不允许也得允许。虽然允许,但是建议的写法应该是const char* my_name= “Tony”;这样假如后面写my_name[0] = “x”的话编译器就不会让它编译通过,也就避免了上面说的运行时异常。
PS:在C++03中,char* my_name= “Tony”是合法的,但在C++11中是非法的,C++11必须这样写:const char* my_name= “Tony”

8

指针my_name和me都没有分配存储单元的,只是一个指针变量,例如,int a;一样,只不过他是指向了常量区的2个字符串常量的地址罢了,调用他就可以访问那2个字符串,但不能修改其内容的,原因是不能修改常量的。要是malloc一个空间给一个指针的话,那此指针内的数据可以修改的了,本人技术不行,理解不当之处,望高手指正,学习中!

6

是啊,存在静态常量区
谁说指针一定要动态分配内存,指向常量区、指向栈上的变量一样可以啊

6

my_name和me指针属于局部变量,在32位系统中,该局部变量占4个字节;这两个指针在栈上分配的,my_name = me;只是将me指向的地址值赋值给了my_name;这样my_name的内存空间(4个字节)存放的是新的字符串的地址;

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明c指针存储单元
喜欢 (0)
[1034331897@qq.com]
分享 (0)