免费注册 查看新帖 |

Chinaunix

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

[C] calloc的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-04 13:01 |只看该作者 |倒序浏览
#include <stdio.h>

int
main(void)
{
    char *str = NULL;

    /* allocate memory for string */
    str = calloc(0, sizeof(char));

    /* copy "Hello" into string */
    strcpy(str, "Hello");

    /* display string */
    printf("String is %s\n", str);

    /* free memory */
    free(str);

    return 0;
}

程序能完整输出:String is Hello
不直到calloc的第一个参数虾米意思?忘高手指点

论坛徽章:
0
2 [报告]
发表于 2009-04-04 13:19 |只看该作者
没人看明白我的意思吗?
就是无论我给calloc的第一个参数赋值多少,不管0还是10,结果都能正确出来

论坛徽章:
0
3 [报告]
发表于 2009-04-04 14:37 |只看该作者

回复 #2 UpbooWang 的帖子

这有什么奇怪的,calloc为0分配,这个应该看C语言标准
如果标准里面没有做说明,那么行为是没有定义的

什么是行为没有定义的,就是不同的C库实现,可以给你分配一个可用的虚拟地址让你写,也可能报个错,也可能直接给你返回个NULL,这些行为都是正常的,因为标准里面没有说它是不正常的。

如果给你分配个虚拟地址,或者没有分配,而你有这样一个指针指向一个地址,而这个地址在你的进程空间里面非只读,那么你就可以写了,strcpy是一点问题都没有
为什么没问题呢,答案要从malloc或者calloc说起
这些内存分配,并不是说分配了你就能写,不分配你就不能写
而是,用了这些分配函数,系统就记下了分配地址,这个只是为了管理地址而做了一些标记而已,系统帮你记住进程地址空间属于堆的那些地址,哪些用了,哪些没用,这样你就不用自己来管理了,因为系统的这两个函数为你保证了,你下次分配不会和上次分配有冲突

所以,应该可以明白了吧

论坛徽章:
0
4 [报告]
发表于 2009-04-04 14:41 |只看该作者

回复 #3 astezheng 的帖子

至于参数什么意思,建议你上网搜一搜,这是个学习方法,有些问题,依靠别人的帖子回复的答案,不能保证是对的

论坛徽章:
0
5 [报告]
发表于 2009-04-04 15:03 |只看该作者
这个式子本来就有错,你键入数据前分配内存,而不是直接在NULL那分配内存

论坛徽章:
0
6 [报告]
发表于 2009-04-04 15:42 |只看该作者
CALLOC(3)                  UNIX Programmer's Manual                  CALLOC(3)

NAME
     calloc - allocate clean memory (zero initialized space)

SYNOPSIS
     #include <stdlib.h>

     void *
     calloc(size_t nmemb, size_t size)

DESCRIPTION
     The calloc() function allocates space for an array of nmemb objects, each
     of whose size is size. The space is initialized to all bits zero.

RETURN VALUES
     The calloc() function returns a pointer to the the allocated space if
     successful; otherwise a null pointer is returned.

SEE ALSO
     malloc(3),  realloc(3),  free(3),

STANDARDS
     The calloc() function conforms to ANSI X3.159-1989 (``ANSI C'').

BSD Experimental                                                             1

论坛徽章:
0
7 [报告]
发表于 2009-04-04 16:03 |只看该作者
顺便提一下,malloc(0) 会导致的结果也是由实现决定的。
http://bytes.com/groups/c/508471-malloc-0-a#post1977207

论坛徽章:
0
8 [报告]
发表于 2009-04-04 17:39 |只看该作者
领教了,多谢回帖

论坛徽章:
0
9 [报告]
发表于 2009-04-08 13:37 |只看该作者

回复 #1 UpbooWang 的帖子

能输出 很幸运!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP