Chinaunix

标题: 这段代码很诡异啊!(关于指针) [打印本页]

作者: woods2001    时间: 2010-04-28 09:40
标题: 这段代码很诡异啊!(关于指针)
本帖最后由 woods2001 于 2010-04-28 09:42 编辑
  1. char * const * next()
  2. {
  3.     char * const *c_ptr;
  4.     char  *buffer;
  5.     buffer = (char *)malloc(sizeof(char) * 20);
  6.     strcpy(buffer, "hello, world!");

  7.     c_ptr = &buffer;

  8.     printf("In function next.\n");

  9.     return c_ptr;
  10. }

  11. int main(void)
  12. {
  13.     char * const *ptr;
  14.     char c;
  15.     ptr = next();

  16.     //printf("%x\n", ptr);
  17.     printf("%s\n", *ptr);
  18.     printf("%p\n", *ptr);
  19.     printf("%s\n", *ptr);
  20.     printf("%p\n", *ptr);

  21.     printf("26\n");
  22.     //(*ptr)[3] = 'r';
  23.     printf("28\n");
  24.     //c = (*ptr)[3];
  25.     printf("30\n");

  26.    // printf("%c\n", c);
  27.     printf("%s\n", *ptr);
  28. }

复制代码
结果:
In function next.
hello, world!
0x8048560
****乱码****
0x8048560
26
28
30
****乱码****


乱码了阿,*ptr是同一个地址阿,在没经过任何修改之下,输出怎么乱码了
我编制这个程序是想知道  char * const *  究竟是什么意义:1.一个常量指针,指向指针且该指针指向char类型
                                                                                  2.一个指针,指向常量指针且该指针指向char类型
作者: hellioncu    时间: 2010-04-28 09:44
return c_ptr;返回的是栈里面的地址
作者: numdisp    时间: 2010-04-28 09:56
char * const * ptr;

ptr 是一个指针,指向一个常量指针。

上面的乱码原因2楼已经说了。
作者: pmerofc    时间: 2010-04-28 10:26
提示: 作者被禁止或删除 内容自动屏蔽
作者: huangwei0413    时间: 2010-04-28 11:11
又返回局部变量的地址
作者: rampike    时间: 2010-04-28 12:00
同意2楼。

虽然buffer分配的内存是在堆上,但是函数返回的是保存该堆上地址的地址,
是个栈地址。
作者: pengjianbokobe    时间: 2010-04-28 12:25
3楼正解
作者: woods2001    时间: 2010-04-28 14:22
回复 4# pmerofc


    确实出问题了
  *c_ptr = buffer;   //这样才对
    还有一个地方也出问题了

  char const *  * c_ptr = (void *)malloc(sizeof(char const * ));  //这样定义才行
  如果写成这样:
  char * const * c_ptr = (void *)malloc(sizeof(char * const ));  //这样定义
  待会给成c_ptr指针赋值的时候会出现问题
   它的内定义成一个const指针的话,初始化以后就不能赋值了。
  报错:prototype.c:11: 错误: 向只读位置‘*c_ptr’赋值
作者: pmerofc    时间: 2010-04-28 21:22
提示: 作者被禁止或删除 内容自动屏蔽
作者: 威海之水    时间: 2010-04-28 21:43
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2