Chinaunix
标题:
这段代码很诡异啊!(关于指针)
[打印本页]
作者:
woods2001
时间:
2010-04-28 09:40
标题:
这段代码很诡异啊!(关于指针)
本帖最后由 woods2001 于 2010-04-28 09:42 编辑
char * const * next()
{
char * const *c_ptr;
char *buffer;
buffer = (char *)malloc(sizeof(char) * 20);
strcpy(buffer, "hello, world!");
c_ptr = &buffer;
printf("In function next.\n");
return c_ptr;
}
int main(void)
{
char * const *ptr;
char c;
ptr = next();
//printf("%x\n", ptr);
printf("%s\n", *ptr);
printf("%p\n", *ptr);
printf("%s\n", *ptr);
printf("%p\n", *ptr);
printf("26\n");
//(*ptr)[3] = 'r';
printf("28\n");
//c = (*ptr)[3];
printf("30\n");
// printf("%c\n", c);
printf("%s\n", *ptr);
}
复制代码
结果:
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