GTK+中文社区(gtk.awaysoft.com)

 找回密码
 马上加入

QQ登录

只需一步,快速开始

查看: 5280|回复: 7

指针和strcpy和malloc,求解

[复制链接]
  • TA的每日心情
    无聊
    2013-9-23 22:35
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2011-2-16 23:12:50 | 显示全部楼层 |阅读模式
    先贴上代码
    1. #include <stdio.h>
    2. #include <string.h>
    3. #include <stdlib.h>
    4. int main()
    5. {
    6.     char *tmp;
    7.     char *ptr;
    8.     tmp=malloc(sizeof(char)*2);
    9.     scanf("%s",ptr);
    10.     strcpy(tmp,ptr);
    11.    
    12.     printf("ptr:%ld\n",strlen(ptr));
    13.     printf("tmp:%ld\n",strlen(tmp));
    14.         free(tmp);
    15.     return 0;
    16. }
    复制代码

    有个不明白的地方:
    为指针tmp分配了2个char的内存,为什么不论ptr指向的字符串有多长,strcpy(tmp,ptr)都能执行?

    将程序改为以下形式,仍然可以运行:
    1. #include <stdio.h>
    2. #include <string.h>
    3. #include <stdlib.h>
    4. int main()
    5. {
    6.     char tmp[2];
    7.     char ptr[]="test";
    8.     strcpy(tmp,ptr);
    9.     printf("tmp:%s,sizeof:%ld,\n",tmp,sizeof(tmp));
    10.     printf("ptr:%ld\n",strlen(ptr));
    11.     printf("tmp:%ld\n",strlen(tmp));
    12.     return 0;
    13. }
    复制代码
    这里tmp明显没有足够的空间容纳ptr的字符串,为什么还能运行呢?
  • TA的每日心情
    奋斗
    2021-11-19 13:15
  • 签到天数: 20 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2011-2-18 07:58:22 | 显示全部楼层
    编译器在分配空间的时候,不是分配你指定的数目,而是N的多少倍,N我忘了是多少了,所以,实际上,一般超出几个字节不会报错,还有就是,如果没有越界到程序外面去,程序也可能不会报错。。。
  • TA的每日心情
    无聊
    2013-9-23 22:35
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2011-2-18 18:55:31 | 显示全部楼层
    还是不太明白,那分配空间的时候应该分多少啊?
  • TA的每日心情
    奋斗
    2021-11-19 13:15
  • 签到天数: 20 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2011-2-19 21:22:55 | 显示全部楼层
    引用第2楼firebat于2011-02-18 10:55发表的  :
    还是不太明白,那分配空间的时候应该分多少啊?
    当然是需要多少就分配多少啊
    比如
    1. char st[]="Hello World!\\n";
    2. char *st2;
    3. st2 = (char *)malloc((strlen(st) + 1) * sizeof(char));
    4. strcpy(st2, st);
    复制代码
  • TA的每日心情
    无聊
    2013-9-23 22:35
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2011-2-20 22:22:40 | 显示全部楼层
    但是实际上分配多少都行啊

    该用户从未签到

    发表于 2011-7-28 07:26:27 | 显示全部楼层
    不行的,分配少了会出错。

    该用户从未签到

    发表于 2012-11-8 14:57:34 | 显示全部楼层
    多出来的部分应该是写到了未被系统使用的空闲内存区,这个时候就是最危险的时候,因为这个错误很隐蔽,只有在特定的情况下(多写入的那块内存刚好被程序的其它部分使用),才会出错。。。
    wang1216 该用户已被删除
    发表于 2013-8-10 10:49:41 | 显示全部楼层
    提示: 作者被禁止或删除 内容自动屏蔽
    *滑块验证:
    您需要登录后才可以回帖 登录 | 马上加入

    本版积分规则

    申请友链|Archiver|小黑屋|手机版|GTK+中文社区 ( 粤ICP备13080851号 )

    我要啦免费统计

    GMT+8, 2024-12-21 23:45 , Processed in 0.037670 second(s), 8 queries , Redis On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表