免费注册 查看新帖 |

Chinaunix

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

[C] 【已解决】怎么把字符串写入指定地址? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-03-21 19:10 |只看该作者 |倒序浏览
本帖最后由 石世荣 于 2015-05-07 22:39 编辑

比如:想在分配的内存地址入口处写入字符串。
  1. #include "stdio.h"
  2. #include "string.h"
  3. #include "stdlib.h"
  4. int main()
  5. {
  6.     char *p;
  7.     p=(char *)malloc(100);
  8.     p="this is string";         //就是这里想把字符串写入分配的地方,后来才发现这句是把p重新赋值。这句应该怎么写?
  9.     puts(p);
  10.     free(p);
  11. }
复制代码
还有百度的一个赋值方法
  1. *(int *)p=65534;
复制代码
貌似只能赋1个字节以内的数,两个字节的都要出错(编译通过了但是貌似是溢出了)我写为了
  1. *(unsigned int *)p=(unsigned int)65534;
复制代码
还是错的;

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:032015年亚洲杯之中国
日期:2015-04-22 15:52:45
2 [报告]
发表于 2015-03-21 20:09 |只看该作者
过于基础了...先学习一下C的字符串与指针这一块的内容吧.

论坛徽章:
0
3 [报告]
发表于 2015-03-21 21:58 |只看该作者
教材是《C语言程序设计(谭浩强)第三版》,里面貌似没讲这个回复 2# hanxin83


   

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
4 [报告]
发表于 2015-03-21 22:48 |只看该作者
用strcpy、memcpy之类的函数。

后面两个赋值出什么错?是对齐问题导致的bus error还是你自己认为的错?没有对齐问题的话,这两句都对。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2015-03-24 09:28 |只看该作者
因为p是char型的指针,虽然后两句确实将数据写入了p所指的内存(因为超过char范围,其实,占用了p[0]和p[1]),显示时,如果按照char来显示p,则显示的p[0],就像溢出了

论坛徽章:
7
天秤座
日期:2014-08-07 13:56:30丑牛
日期:2014-08-27 20:34:21双鱼座
日期:2014-08-27 22:02:21天秤座
日期:2014-08-30 10:39:11双鱼座
日期:2014-09-21 20:07:532015年亚洲杯之日本
日期:2015-02-06 14:00:282015亚冠之大阪钢巴
日期:2015-11-02 14:50:19
6 [报告]
发表于 2015-03-24 09:50 |只看该作者
回复 5# 羽剑天涯
你的回答有问题,p = "this is a string"并没有把这段内容写到malloc出来的地址,而是把p的指针改写成一个指向“this is a string”字符串的地址,这个字符串保存在.rodata段,这时候p的地址改变了,不是malloc的那块,所以free会出错。
你查看汇编代码可以发现,同时GCC -O2会有warning。
warning: attempt to free a non-heap object
  1.     .section    .rodata.str1.1,"aMS",@progbits,1
  2. .LC0:
  3.     .string "this is string"
  4.     .text
  5.     .p2align 4,,15
  6. .globl main
  7.     .type   main, @function
  8. main:
  9. .LFB30:
  10.     .cfi_startproc
  11.     subq    $8, %rsp
  12.     .cfi_def_cfa_offset 16
  13.     movl    $100, %edi
  14.     call    malloc
  15.     movl    $.LC0, %edi
复制代码

论坛徽章:
7
天秤座
日期:2014-08-07 13:56:30丑牛
日期:2014-08-27 20:34:21双鱼座
日期:2014-08-27 22:02:21天秤座
日期:2014-08-30 10:39:11双鱼座
日期:2014-09-21 20:07:532015年亚洲杯之日本
日期:2015-02-06 14:00:282015亚冠之大阪钢巴
日期:2015-11-02 14:50:19
7 [报告]
发表于 2015-03-24 09:52 |只看该作者
本帖最后由 MeRcy_PM 于 2015-03-24 10:00 编辑

额。。网络卡了,不小心风怒了……

论坛徽章:
7
天秤座
日期:2014-08-07 13:56:30丑牛
日期:2014-08-27 20:34:21双鱼座
日期:2014-08-27 22:02:21天秤座
日期:2014-08-30 10:39:11双鱼座
日期:2014-09-21 20:07:532015年亚洲杯之日本
日期:2015-02-06 14:00:282015亚冠之大阪钢巴
日期:2015-11-02 14:50:19
8 [报告]
发表于 2015-03-24 09:53 |只看该作者
本帖最后由 MeRcy_PM 于 2015-03-24 10:01 编辑

求教如何删除……

论坛徽章:
7
天秤座
日期:2014-08-07 13:56:30丑牛
日期:2014-08-27 20:34:21双鱼座
日期:2014-08-27 22:02:21天秤座
日期:2014-08-30 10:39:11双鱼座
日期:2014-09-21 20:07:532015年亚洲杯之日本
日期:2015-02-06 14:00:282015亚冠之大阪钢巴
日期:2015-11-02 14:50:19
9 [报告]
发表于 2015-03-24 09:54 |只看该作者
本帖最后由 MeRcy_PM 于 2015-03-24 10:02 编辑


   

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2015-03-24 11:06 |只看该作者
回复 6# MeRcy_PM


    我是指后两句,也就是
……
还有百度的一个赋值方法
*(int *)p=65534;
复制代码
貌似只能赋1个字节以内的数,两个字节的都要出错(编译通过了但是貌似是溢出了)我写为了
*(unsigned int *)p=(unsigned int)65534;
复制代码
还是错的;
……

至于一开始的那个p="this is string",这种用法确实如你所分析的,一般用在变量初始化,编译器会为字符串分配好内存,并将p指针指向这片内存,在楼主的应用中,p先指向了malloc的内存,又指向了这个字符串的内存,此时malloc的内存地址就丢掉了(不知道地址,无法free),这样就有问题了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP