随笔-28  评论-51  文章-10  trackbacks-0
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 //前算完算阿,以前一直以为弄懂了传值和传引用,但是现在//一看未必阿,特别是碰到指针的时候
 4 char **data;
 5 void fun(char ** pointer)
 6 {
 7         pointer=(char**)malloc(sizeof(char** 10);
 8         pointer[0= (char*)malloc(sizeof(char* 10);
 9         pointer[0][0= 'a';
10         pointer[0][1= 'b';
11         pointer[0][2= '\0';
12     
13         printf("IN fun: output: %s\n", pointer[0]);
14         
15 }
16 int main()
17 {
18     
19     fun(data);
20     printf("IN main: output: %s\n", data[0]);     
21     return 0;
22 }
23 
24
上面的代码能正确执行吗?
各位高手应该能看出来了。。
结果是:(gcc下)
IN fun: output: ab
Segmentation fault (core dumped)

愣了好一阵子,才反映过来,被传的指针蒙骗了,
在12行加入这行就ok了。这个随是小事,但马虎不得阿,哈哈

        data = pointer;
posted on 2008-03-28 22:54 fullfocus 阅读(1419) 评论(9)  编辑  收藏 所属分类: C/C++

评论:
# re: 指针和引用, 你真的会了么? 2008-03-29 15:27 | ZelluX
看来你还是没搞清楚.  回复  更多评论
  
# re: 指针和引用, 你真的会了么? 2008-03-29 15:57 | fullfocus
@ZelluX
-》看来你还是没搞清楚??
后来修改了以后,可以成功运行,输出也正确啊,是不是还有我没考虑周全的地方? 多谢指教!!^_^


  回复  更多评论
  
# re: 指针和引用, 你真的会了么? 2008-03-29 18:06 | raof01
首先,指针和引用不是一个概念——尽管很多编译器用指针实现引用。其次,你还是没有搞清楚指针。
data = pointer; //使用全局数据,并没有真正使用参数返回内存
fun(data); // 使用全局变量作为参数,而函数体中又使用了data这个全局变量。实际上,fun中的pointer就是data的一个拷贝。
综上,整个程序是个充满bug的程序,而且还有内存泄露,每次调用fun(),则要丢失50个字节。这个程序只不过碰巧能工作罢了。整个程序和你对于指针的理解都是一塌糊涂——这么说有点不客气,但这是事实。
相信你是希望通过一个二级指针来返回一段内存,那么应该如下:
void fun(char ** &pointer)
{
pointer=(char**)malloc(sizeof(char*) * 10); // pointer指向一块内存区,该内存区的元素类型是char *相当于char * []
*pointer = (char*)malloc(sizeof(char) * 10);//为第一个元素分配10字节空间
**pointer = 'a';
*(*pointer + 1) = 'b';
*(*pointer + 2) = '\0';
printf("IN fun: output: %s\n", *pointer);
}
int main()
{
char **data;
fun(&data);
printf("IN main: output: %s\n", *data);
if (*data) //释放内存
free(*data);
if (data)
free(data);
return 0;
}
当使用指针时不能够清楚理解时,画一个图能有助于理解。有问题可以参考:"指针是通往地狱的捷径"(http://blog.chinaunix.net/u/12783/showart_376700.html)及"C/C++:如何理解复杂的声明"(http://blog.chinaunix.net/u/12783/showart_378340.html)  回复  更多评论
  
# re: 指针和引用, 你真的会了么? 2008-03-29 18:12 | raof01
typedef char * T;
void fun(T* &);
这样写估计好理解一些。本来不需要“&”,但你要返回的是这样一段内存:
------<----- T*
| T |-->-------------------------------------------
------ | | | | | | | | | | | |
| | -------------------------------------------
------
| |
------
| |
------
| |
------
| |
------
| |
------
| |
------
| |
------
| |
------  回复  更多评论
  
# re: 指针和引用, 你真的会了么? 2008-03-29 19:23 | raof01
或者:
char ** func();
// ...
// In main():
char ** data = func();
// ...
无论如何,你还是看看林锐的《高质量C/C++编程》  回复  更多评论
  
# re: 指针和引用, 你真的会了么?[未登录] 2008-03-29 20:04 | fullfocus
@raof01
真的非常感谢raof01,写惯了java,根本没有意识到c还要释放内存的。您举的两个例子非常棒,看了你的文章,orz.....^_^

我本来也试图用引用&的,但是gcc不支持,就是说c语言里面没有引用的,也许比较BT,最近就是想做纯c的, 所以最后选择了全局变量 char **data; 来获得fun的结果,不知道还有什么好方法,可以获得fun处理后的结果的(c语言)?  回复  更多评论
  
# re: 指针和引用, 你真的会了么? 2008-03-29 20:55 | ZelluX
@fullfocus
你用的是C,却用了这么个题目,不看代码都知道你的理解还有偏差。
建议先看看Computer System, A Programmer's Perspective.  回复  更多评论
  
# re: 指针和引用, 你真的会了么? 2008-03-29 22:08 | raof01
@fullfocus
char ** fun()
{
char ** pointer=(char**)malloc(sizeof(char*) * 10);
*pointer = (char*)malloc(sizeof(char) * 10);
**pointer = 'a';
*(*pointer + 1) = 'b';
*(*pointer + 2) = '\0';
printf("IN fun: output: %s\n", *pointer);
return pointer;
}
另:对于java,引用的传递也是一个很容易引起迷惑的地方。同事中有从事java开发的,他们对于java的引用的理解也经常出现偏差。我不知道怎么实现java中的“修改引用本身”,但是也许你能给出些解释。具体问题的定义参考“C#中引用与C++中指针和引用以及参数的传递”(http://blog.chinaunix.net/u/12783/showart_380164.html),我在其中列出了C#和C++的实现,不知你能不能在后面附上java的实现。  回复  更多评论
  
# re: 指针和引用, 你真的会了么? 2008-04-06 09:09 | 一手的小窝窝
说实话,我跟着 ccrun.com 里面牛人混了几年,还是没搞清楚,失败,没有专注去做 C /C++,虽然觉得它好,但是自我感觉,不下功能,还是不能理解,C++是比较复杂,需要的知识体系比较全面。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: