Chinaunix首页 | 论坛 | 博客
  • 博客访问: 51130
  • 博文数量: 9
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 145
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-16 18:31
个人简介

关注PostgreSQL,关注数据库技术以及分布式系统,热爱开源,享受生活

文章分类

全部博文(9)

文章存档

2015年(1)

2014年(6)

2013年(2)

我的朋友

分类: C/C++

2015-03-11 19:25:28


点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. void getmemory(char *p)
  4. {
  5.     p = (char *)malloc(100);
  6.     strcpy(p, "hello, world!");
  7. }
  8.     
  9. int main(void) {
  10.     char *str = 0;
  11.     getmemory(str);
  12.     printf("%s\n", str);
  13.     free(str);
  14.     return 0;
  15. }
以上代码有两处错误:1)NULL用于printf; 2)函数参数传递方式

NULL
C语言中的NULL用来表示空指针,定义在stddef.h中,在指针上下文中,
整数0等价于NULL,此时的0会被转换为(void *)0,详见参考文献。
对于printf函数,运行以下代码:
点击(此处)折叠或打开
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main(void) {
  4.     char *str = NULL;
  5.     printf("%s\n", str);       #1
  6.     //printf("%s", str);       #2
  7.     return 0;
  8. }
在GCC中执行时会出现段错误,但如果将#1行去掉,而使用#2行,则可以正确执行,输出结果为(null)。

这又是为什么呢?
从它们各自的汇编代码中可以看到,#2时最终实际调用的函数为printf,printf对于str为NULL时的行为是未定义的;而对于#1,最终调用的是puts,编译器在进行优化时,将printf转换为了puts,puts函数会将内容输出至stdout时,紧跟着添加一个换行,与此相对的是,fputs在将内容输出至文件时,不会添加换行。问题就在于puts(NULL)会导致段错误。

参数传递
C语言中函数参数是值传递,即在调用函数时,传递的是参数的一份拷贝,如果我们在被调函数中对这些参数进行修改,并不会改变其原来的值。因此,需要通过指针传递一个地址,此时我们传递是指针的一份拷贝,但指针指向的位置是一样的,因此,在函数中对指针所指地址中的内容进行修改,对于调用它的函数来讲就是可见的,因此,以上代码可以修改如下:
点击(此处)折叠或打开
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. void getmemory(char **p)
  4. {
  5.     *p = (char *)malloc(100);
  6.     strcpy(*p, "hello, world!");
  7.     }
  8.     
  9. int main(void) {
  10.     char *str = NULL;
  11.     getmemory(&str);
  12.     printf("%s\n", str);
  13.     free(str);
  14.     return 0;
  15. }

参考文献
1. 
2. 
3. 
4. 
5. 
阅读(2710) | 评论(0) | 转发(0) |
0

上一篇:快速搭建gitlab服务

下一篇:没有了

给主人留下些什么吧!~~