免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: tom_fans
打印 上一主题 下一主题

[C] 问一个malloc的问题 [复制链接]

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
11 [报告]
发表于 2014-05-15 11:40 |只看该作者
__SevenEleven 发表于 2014-05-15 11:12
int *p=10是错误的,正确的应该是int *p,a=10; p=&a;


int *p=10;和int *p,a=10; p=&a;含义不一样,不能算错。

论坛徽章:
0
12 [报告]
发表于 2014-05-15 13:27 |只看该作者
hellioncu 发表于 2014-05-14 17:10
int *p=10没有错误,10是一个合法的地址。虽然不少场合下你去访问这个地址的内容会异常,但不能算错,跟 ...
int *p=10这里的10只是一个整形常量,不是一个地址。int *p=(int *)10,这里的10才是一个合法的地址

论坛徽章:
0
13 [报告]
发表于 2014-05-15 13:38 |只看该作者
hellioncu 发表于 2014-05-15 11:40
int *p=10;和int *p,a=10; p=&a;含义不一样,不能算错。

int *p=10这里的10只是一个整形常量,不是一个地址。int *p=(int *)10,这里的10才是一个合法的地址。
你说的int *p=NULL是合法的,这没错,只不过NULL是0,这只是一个编译器的特例,就像其他的一些C语言特例一样

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
14 [报告]
发表于 2014-05-15 13:45 |只看该作者
__SevenEleven 发表于 2014-05-15 13:27
int *p=10这里的10只是一个整形常量,不是一个地址。int *p=(int *)10,这里的10才是一个合法的地址


强制转换只是语法上面的东西,本质是一样的,一般C编译器最多给个警告。

论坛徽章:
0
15 [报告]
发表于 2014-05-15 13:50 |只看该作者
hellioncu 发表于 2014-05-15 13:45
强制转换只是语法上面的东西,本质是一样的,一般C编译器最多给个警告。
有道理,我是从语法上理解那样做是不合理的。如果只从底层汇编上都是一样的,虽然这样做基本没有意义,因为你很可能不确定这是个有效的你可以操作的地址

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
16 [报告]
发表于 2014-05-15 14:36 |只看该作者
__SevenEleven 发表于 2014-05-15 13:50
有道理,我是从语法上理解那样做是不合理的。如果只从底层汇编上都是一样的,虽然这样做基本没有意义,因为 ...


在某些嵌入式环境下,这样直接指定地址访问可能是普遍现象

论坛徽章:
0
17 [报告]
发表于 2014-05-15 14:47 |只看该作者
hellioncu 发表于 2014-05-15 14:36
在某些嵌入式环境下,这样直接指定地址访问可能是普遍现象
是,但也不应该这样写,不严谨,最好强制转换,不然可读性太差

论坛徽章:
0
18 [报告]
发表于 2014-05-15 16:40 |只看该作者
--
char *p; 声明的是一个字符指针p,p只能存放地址。

"test"跟"test1"都是字符串常量,而且是存放在不同地方的完全不同的两个字符串常量。用vc查查内存你会看到两个都有。

char *p = "test"; 仅仅是把"test"的首地址赋值给p
p = "test1"; 是将"test1"的首地址赋值给p。(而并不是你期待的用test1写改写test所在地址的内容),常量都是只读的,你只能从一个常量指向另外一个常量。

--
int *p; 声明的是一个整形指针p,p同样只能存放地址。
int *p = 10; 在编译器的理解就是将p指向的地址值初始化为10。这么写在语法上没有什么问题,但这么写也没有意义,你根本不知道地址10上究竟放的是什么玩意。(不过从经验上来看,低地址要么是数据段,要么是代码段,这写都是只读区域)

--
两个结合起来看的话会产生你的疑惑也正常,c会为所有的数据/变量定义类型,类型不同,编译器的处理方法就不同。

论坛徽章:
0
19 [报告]
发表于 2014-05-17 15:39 |只看该作者
tom_fans 发表于 2014-05-11 17:15
为什么字符串常量可以直接赋予指针, 而整形常量却不可以,一定要先malloc ?

char *p = "test';  这个 ...

回答你两个问题
1)为什么字符串常量可以直接赋予指针, 而整形常量却不可以,一定要先malloc ?
    整形常量是什么?int吗?假设如此(实际上,integer types包括int,并不等价于int)。
    char *p = "test";
     其中"test"叫做字符串字面值(string-literal),它是一种初等量,此处"test"做右值,表示一类char *的指针。此式子是将一个char *指针的值来初始化另一个char *指针p(它同时在本句被定义)。所以没有问题。
   char *p = 10;
   10是一个整数常量,它是一个int型的常量。赋值号左边是一个char *指针。int型可以convert成char *指针,但是结果是implementation-defined。
   但是may convert不代表你直接这么写就没问题,正常的写法是:
   char *p = (char *)10;
   这种写法在语法上是完全没问题的。
   至于你说的先malloc云云,我不懂你想说什么。
2)你的这个程序,不能解释你说的问题。
     你改变的是p,而不是p所指向的区域。

论坛徽章:
0
20 [报告]
发表于 2014-05-18 08:54 |只看该作者
你改的不是字符串常量,你该的是指针,注意区分const char *ptr,char* const p; const char* const ptr;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP