免费注册 查看新帖 |

Chinaunix

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

关于strncopy()的用法? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-04 23:07 |只看该作者 |倒序浏览
大牛帮看看,我的代码:
#include <stdio.h>
#include <string.h>
void main(void)
{       char *s="i am yours";
        char *p="ahhhhhhhhhhhhh";
        strncpy(p,s,4);
        printf("s:%s:\n",s);
        printf("p:%s:",p);
}
在linux下运行总是报“段错误”,改成
#include <stdio.h>
#include <string.h>
void main(void)
{       char *s="i am yours";
        char p[20]="ahhhhhhhhhhhhh";
        strncpy(p,s,4);
        printf("s:%s:\n",s);
        printf("p:%s:",p);
}
就好了。
不知是什么原因。strncpy()第一个参数不就是char *类型的吗。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2009-11-05 09:27 |只看该作者

回复 #1 yians 的帖子

在第一个例子中,p 指向的地址是不可写的,故有段错误。

论坛徽章:
0
3 [报告]
发表于 2009-11-05 10:43 |只看该作者

回复 #2 MMMIX 的帖子

不都是在heap上分配么?
为何有的可写,有的不可以?明识~

论坛徽章:
0
4 [报告]
发表于 2009-11-05 10:45 |只看该作者
指向了常量区

论坛徽章:
0
5 [报告]
发表于 2009-11-05 16:47 |只看该作者
常量区?

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
6 [报告]
发表于 2009-11-05 17:44 |只看该作者
指针
例如
char *p="aaaaaa";
这段区域是readonly的,you can't rewrite in it

论坛徽章:
0
7 [报告]
发表于 2009-11-05 20:07 |只看该作者

回复 #1 yians 的帖子

给你转一下c下面的存储区吧:
在c中分为这几个存储区
1.栈 - 由编译器自动分配释放
2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放
4.另外还有一个专门放常量的地方。- 程序结束释放

char *p="ahhhhhhhhhhhhh"; 存放在常量区,不允许更改
char p[20]="ahhhhhhhhhhhhh"; 存放在栈里面,可以更改

论坛徽章:
0
8 [报告]
发表于 2009-11-05 21:08 |只看该作者

回复 #6 T-Bagwell 的帖子

各位,讨论的问题正是我目前比较没懂的问题

最近在看spcaview,我发现里面大量的用到了字符串指针。其中很让我有点不明白

例如,现顶一个字符串指针

char  *name;
...

...

..
然后在后面出现给给这个指针赋值。

name=getstring();
问题是,如果name是数组的话,这样赋值没问题,因为数组申请了空间后,系统不会再把这个空间分配给别人。
但是这里name是指针,虽然现在这个name已经有了内容,但是不排除系统会把name指向的空间分配给别人,那岂不是name原来指向的内容就被覆盖了??

不是很明白,记得给我们上嵌入式的老师第一节课就给我们讲,

char   *p;
char   *s="asdger";

p=s;
老师说这种情况就是p指向的内容可以被系统分配给人别人。为了避免这种情况,要么用数组,要么malloc申请空间。
我都混乱了
各位可否给我一个解释?
谢谢

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
9 [报告]
发表于 2009-11-06 14:02 |只看该作者
这么去理解
指针是指向一段地址空间的,例如
你的手指指向一个房间,那么,这个房间里面可以进人
如果你的手指指向的是一块铁块,那么,这个铁块里面能进去人么?

指针指向的"aaaaaaa",这段空间就是之前讲的铁块一样的地方,你没有办法往里面装入东西,这段空间就是常量内存空间
指向一段数组的时候,或者malloc申请的内存空间的时候,这段空间就像房子一样,随便你进人和出人

论坛徽章:
0
10 [报告]
发表于 2009-11-06 23:09 |只看该作者

回复 #9 T-Bagwell 的帖子

谢谢,懂了。受教了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP