免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2687 | 回复: 12
打印 上一主题 下一主题

一个C语言初级问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-01-17 14:45 |只看该作者 |倒序浏览
如果一个程序中如下2个函数:
void m1()
{
    char* a1 = "abc";
    char* b1 = "abc";
    const char* c1 = "abc";
}

char* m2()
{
    char* a2 = "abc";
    char* b2 = "abc";
    const char* c2 = "abc";
    return a2;
}

1、据说“abc”是存在常量区,那么a1,b1,c1,a2,b2,c2是不是全都指向同一个地址?

2、a1,c1是不是等价的?意思就是a1的写法是不是默认就表示a1是个常量指针?

3、常量区的字符串会自动释放么?比如那个函数m2中,a2被返回给调用者以后,a2会变成野指针么?意思就是方法结束以后,常量区的“abc”会离开被干掉么?

4、函数m2要怎么写,才会导致返回给调用者时已经变成野指针了?

最后一个问题:

这个版不是c/c++么,为什么全是讨论c++的帖子,c的帖子几乎看不到啊

论坛徽章:
0
2 [报告]
发表于 2012-01-17 14:51 |只看该作者
楼主口气真像解毒专家

论坛徽章:
0
3 [报告]
发表于 2012-01-17 14:58 |只看该作者
回复 2# AD8018


   
   
    啥是解毒专家。
   
    学了一段时间C,总有点自己的理解,但又不知道对不对,就拿出来问问。

   听你的语气就是说我这些理解都是正确的了。

论坛徽章:
0
4 [报告]
发表于 2012-01-17 15:03 |只看该作者
说的不对,大家指正
1.   是同一地址
2.   c里是等价的,c++里编译会报错。
3.  不是野指针,待进程退出后释放
4.   char a2[]="abc";

论坛徽章:
1
射手座
日期:2014-08-04 16:49:43
5 [报告]
发表于 2012-01-17 15:18 |只看该作者
本帖最后由 hanzhenlll 于 2012-01-17 15:20 编辑

1. 什么是常量区。。。。我只知道数据段。。。 是不是指向同一地址, 你猜 ....不如&地址打印一下吧

2.有了打印结果 自然见分晓

3. a2应该不会被释放....但是不推荐这么用

4.  malloc free后 再传递回去   或者 定义 char abc[10]  = {1,3,4,5,6}; 传递回去



最后一个问题....就是一般 玩C有些年头的,都懂些C++.....   一般在这个版混的都是搞上层的,C++ 通用性更高一些,如果玩底层 去内核版   讨论C的多一些...

论坛徽章:
0
6 [报告]
发表于 2012-01-17 15:22 |只看该作者
回复 4# jetking


    3Q,
    再问下哦,那个char a[] = "abc";和char* a = "abc";为什么不一样呀?不是说数组也是指针么。感觉很多地方数组和指针都是混用的,通过数组定义的“abc”不在常量区么?在哪里?

论坛徽章:
0
7 [报告]
发表于 2012-01-17 15:31 |只看该作者
回复 5# hanzhenlll


    请问
    char abc[5]  = {1,3,4,5,6};
    char abc[]  = {1,3,4,5,6};
    char abc[]  = “13456”;

    这3中写法是完全等价的么?就是说不关是编译时还是运行是都是完全一样的?

   搞不懂c语言为什么要提供多种语义表达同一个意思啊,真是难以理解。

   我最喜欢华山一条路了。无选之选才是最好的选择嘛。。。

论坛徽章:
0
8 [报告]
发表于 2012-01-17 15:35 |只看该作者
回复 6# kf38211

char a[]="abc" 表示用"abc"去初始化了一个a的char数组。等价于 char a[]={'a','b','c','\0'};

   

论坛徽章:
1
射手座
日期:2014-08-04 16:49:43
9 [报告]
发表于 2012-01-17 15:46 |只看该作者
回复 7# kf38211


    如果都是死规矩就没有创新了....


char str[]  = " "; 根据字符串中的内容来决定长度
char str[10] = " "; 限制长度在10以内, C里面推荐这种用法,用来检查错误,和控制资源浪费。
char *str = " "; 存储区域不同..... 一个是data段 一个是在栈上...  某些情况下 他俩可以混用,但不代表等价....遇到问题,
要多自己写测试程序去试验,只有这样才能越学越经,否则永远都是皮毛.

论坛徽章:
0
10 [报告]
发表于 2012-01-17 16:18 |只看该作者
回复 5# hanzhenlll


    数据段是常量区的另外一种说法吗?或者你指的是c++的?

    不是说c语言运行的时候内存分配分有4种吗,静态区,堆,栈,常量区。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP