Chinaunix

标题: C语言中有没有sizeof()==1的指针? [打印本页]

作者: albcamus    时间: 2004-11-17 09:06
标题: C语言中有没有sizeof()==1的指针?
记得以前看Linux源代码分析,讲说void*和函数指针都是sizeof()==1的,其余的为4 。(IA32平台)可是刚刚写了小程序输出一下,都是4.

记不清楚了,就来问问朋友们吧
作者: aero    时间: 2004-11-17 09:15
标题: C语言中有没有sizeof()==1的指针?
没看过说是1的。
应该不是,指针里面装的是地址,地址就是一个ulong型的,就是4个字节的。那么指针当然就应该是4个字节的了。
作者: converse    时间: 2004-11-17 09:36
标题: C语言中有没有sizeof()==1的指针?
想想看指针的实质是什么?用来寻址定位数据的,32位cpu中地址是32位的,所以指针必然是32位的。
作者: albcamus    时间: 2004-11-17 09:38
标题: C语言中有没有sizeof()==1的指针?
这个道理偶懂得的,可印象里真的好象看过说有1字节的,莫非是记错了??
作者: aero    时间: 2004-11-17 09:43
标题: C语言中有没有sizeof()==1的指针?
^_^,也许是书写错了。
谭老师的书,推敲过好多年了。还是有错误。

最明显的就是误导淫说hanoi问题只能用递归解决。:-(
作者: soloarrow    时间: 2004-11-17 09:46
标题: C语言中有没有sizeof()==1的指针?
^_^,这样写的通常会出现在注释里,是不是你记得是注释里的?
作者: yangtou    时间: 2004-11-17 12:28
标题: C语言中有没有sizeof()==1的指针?
原帖由 "aero" 发表:
^_^,也许是书写错了。
谭老师的书,推敲过好多年了。还是有错误。

最明显的就是误导淫说hanoi问题只能用递归解决。:-(

我觉得谭的书是给那些还没有学过数据结构的初学者看的,初学的人根本不知道什么是栈,从这点上不应该说谭错了。
而且递归和非递归本质上是一样的。
作者: JohnBull    时间: 2004-11-17 12:32
标题: C语言中有没有sizeof()==1的指针?

  1. char p[1]; printf("%d\n",sizeof(p));
复制代码

作者: aero    时间: 2004-11-17 12:37
标题: C语言中有没有sizeof()==1的指针?
原帖由 "yangtou" 发表:

我觉得谭的书是给那些还没有学过数据结构的初学者看的,初学的人根本不知道什么是栈,从这点上不应该说谭错了。
而且递归和非递归本质上是一样的。


848,这也要维护“权威”,看看讲递归时候的那个hanoi例题,里面的话说的老绝对了。说什么罕见的只能用递归不能用非递归方法解决的古老的数学问题。俺觉得就是错了。错就是错了,对就是对了。还有啥应该8应该D?
作者: aero    时间: 2004-11-17 12:44
标题: C语言中有没有sizeof()==1的指针?
[quote]原帖由 "JohnBull"][/quote 发表:


用这个就是4了。

printf("%d\n", sizeof((void *)p));
作者: assiss    时间: 2004-11-17 12:49
标题: C语言中有没有sizeof()==1的指针?
[quote]原帖由 "JohnBull"][/quote 发表:


大哥,你这是赖皮啊。
人家楼主说的是指针,你用的是数组。
作者: JohnBull    时间: 2004-11-17 13:00
标题: C语言中有没有sizeof()==1的指针?
But is there any other possibles ???
作者: albcamus    时间: 2004-11-17 13:11
标题: C语言中有没有sizeof()==1的指针?
我只是模模糊糊的记得好像在哪里看到过,搞不好是做梦啊,朋友们别怪我…不过很高型大家来讨论一下~
作者: anhowe    时间: 2004-11-17 14:31
标题: C语言中有没有sizeof()==1的指针?
学习[/url]
作者: assiss    时间: 2004-11-17 18:08
标题: C语言中有没有sizeof()==1的指针?
有没有可能,8位机上的sizeof(指针)==1?
作者: aero    时间: 2004-11-17 18:10
标题: C语言中有没有sizeof()==1的指针?
其实,就是编译器处理的不同。看编译出来的汇编代码,像JohnBull老大那样写的,就直接push下去一个1。也没啥理由。^_^。
作者: Kof    时间: 2004-11-17 18:46
标题: C语言中有没有sizeof()==1的指针?
[quote]原帖由 "assiss"]有没有可能,8位机上的sizeof(指针)==1?[/quote 发表:

那要看你什么8位机了
一般来说就是了,除非芯片我来灌,哈哈,说大话了
作者: aero    时间: 2004-11-17 18:49
标题: C语言中有没有sizeof()==1的指针?
原帖由 "Kof" 发表:

那要看你什么8位机了
一般来说就是了,除非芯片我来灌,哈哈,说大话了


仔细看前面的帖子了吗?瞎灌水!
作者: bierdaci    时间: 2005-02-17 14:53
标题: C语言中有没有sizeof()==1的指针?
[quote]原帖由 "JohnBull"][/quote 发表:


这种情况下编译器求的是数组的长度而不是指针多长
作者: nhw_cs    时间: 2005-02-17 16:21
标题: C语言中有没有sizeof()==1的指针?
最好不要对JohnBull老大轻易进行质疑,这么一个简单的问题(数组与指针的区别)难道他会不知道? 他的意思是说,除了这种似是而非的可能之外,根本就没有可能指针长度为1! JohnBull是这里最牛的人之一,经验老到,还有FH也很牛
作者: albcamus    时间: 2005-02-17 16:37
标题: C语言中有没有sizeof()==1的指针?
[quote]原帖由 "nhw_cs"]最好不要对JohnBull老大轻易进行质疑,这么一个简单的问题(数组与指针的区别)难道他会不知道? 他的意思是说,除了这种似是而非的可能之外,根本就没有可能指针长度为1! JohnBull是这里最牛的人之一,经验老到,还有FH也很..........[/quote 发表:
bierdaci也是这里最牛的人之一……大家讨论问题,何必如何计较身份
作者: nhw_cs    时间: 2005-02-17 17:01
标题: C语言中有没有sizeof()==1的指针?
[quote]原帖由 "albcamus"]ierdaci也是这里最牛的人之一……大家讨论问题,何必如何计较身份 [/quote 发表:


就是借机夸奖夸奖别人,没别的意思.其实啊,你也是很牛滴
作者: aero    时间: 2005-02-17 21:45
标题: C语言中有没有sizeof()==1的指针?
俺们C版是养牛的地方。俺是小小放牛娃。
作者: win_hate    时间: 2005-02-17 22:04
标题: C语言中有没有sizeof()==1的指针?
原帖由 "albcamus" 发表:
记得以前看Linux源代码分析,讲说void*和函数指针都是sizeof()==1的,其余的为4 。(IA32平台)可是刚刚写了小程序输出一下,都是4.

记不清楚了,就来问问朋友们吧


你记错了,说的因该是``该指针指向的对象大小强制为1'',也就是在进行指针增减运算时,与 char 指针享有相同的规则。


  1. #include <stdio.h>;

  2. int
  3. main ()
  4. {
  5.         int (*f)();
  6.         f=main;
  7.         printf ("%x %x\n", f, f+1);
  8.         printf ("%d\n", sizeof(*f));

  9.         return 0;
  10. }
复制代码

作者: albcamus    时间: 2005-02-18 10:35
标题: C语言中有没有sizeof()==1的指针?
的确记错了,不是情景分析,是另一本书,《GCC技术参考大全》上说的。但是它的确讲错了,它说:
GCC对void指针和函数指针进行递加/递减运算的单位是1.这是因为void指针和函数指针的操作符的大小(sizeof)为1.

(第4.3.23节)
后一句明显讲错了。以前另开了一个帖子说的,估计斑竹没看到
作者: huang_bu    时间: 2005-02-18 11:38
标题: C语言中有没有sizeof()==1的指针?
sizeof(char)==1,sizeof不是函数是宏,两个概念
作者: lenovo    时间: 2005-02-23 15:32
标题: C语言中有没有sizeof()==1的指针?
今天看gcc的文档,看到这个。

  1. 5.18 Arithmetic on void- and Function-Pointers
  2. In GNU C, addition and subtraction operations are supported on pointers to void and on pointers to functions. This is done by treating the size of a void or of a function as 1.

  3. A consequence of this is that sizeof is also allowed on void and on function types, and returns 1.

  4. The option -Wpointer-arith requests a warning if these extensions are used.
复制代码

作者: albcamus    时间: 2005-02-23 15:48
标题: C语言中有没有sizeof()==1的指针?
多谢lenovo斑竹。看来这本书的意思就是从这里来的,我不懂emacs,所以info版的手册几乎不用

不过输出仍然矛盾。
sizeof(void *)和
void *p,sizeof(p)
的结果还是4。
手册的这句话“sizeof is also allowed on void and on function types, and returns 1. ”岂不也是错的了?会不会是手册没有及时更新?
作者: ivhb    时间: 2005-02-23 15:51
标题: C语言中有没有sizeof()==1的指针?
[quote]原帖由 "JohnBull"][/quote 发表:


要分环境的哦


  1. int
  2. sizeof_test(char p[1])
  3. {
  4.    char s[1];

  5.    return printf("%d %d\n", sizeof p, sizeof s);
  6. }

复制代码

作者: albcamus    时间: 2005-02-23 15:54
标题: C语言中有没有sizeof()==1的指针?
明白了!!是翻译的问题!!

info版gcc手册/《gcc:the complete referrence》的意思是,对void这个符号和对函数名而不是对指向它们的指针进行sizeof操作!!

  1.       1 #include <stdio.h>;
  2.       2
  3.       3 int main()
  4.       4 {
  5.       5         printf("sizeof(void) is %d\n",sizeof(void));
  6.       6         printf("sizeof(main) is %d\n",sizeof(main));
  7.       7
  8.       8         return 0;
  9.       9 }
  10.      10
复制代码
  1. [root@localhost test]# gcc -Wpointer-arith aa.c
  2. aa.c: In function `main':
  3. aa.c:5: warning: sizeof applied to a void type
  4. aa.c:6: warning: sizeof applied to a function type
  5. [root@localhost test]# ./a.out
  6. sizeof(void) is 1
  7. sizeof(main) is 1
复制代码

结果就都是1了!!害死人的翻译啊
作者: lenovo    时间: 2005-02-23 15:56
标题: C语言中有没有sizeof()==1的指针?
原帖由 "albcamus" 发表:
多谢lenovo斑竹。看来这本书的意思就是从这里来的,我不懂emacs,所以info版的手册几乎不用

不过输出仍然矛盾。
sizeof(void *)和
void *p,sizeof(p)
的结果还是4。
手册的这句话“sizeof is also al..........


你仔细看看这句话的意思,
可别被误解了。 :wink:
作者: ivhb    时间: 2005-02-23 15:59
标题: C语言中有没有sizeof()==1的指针?
[quote]原帖由 "win_hate"][/quote 发表:


void *类型的指针,如果不强制转换,++, --操作能行么?
GCC也许支持,但是一般的编译器,都不支持。不知道所指对象的大小,
如何移动指针?没有Linux环境,所以没有实验GCC是否支持。妄言了
作者: albcamus    时间: 2005-02-23 16:04
标题: C语言中有没有sizeof()==1的指针?
原帖由 "lenovo" 发表:


你仔细看看这句话的意思,
可别被误解了。 :wink:

看明白了,Really thanks。翻译造孽啊

P.S. 我特喜欢你签名的那首纳兰词……”聒碎乡心梦不成“
作者: 睡教觉主    时间: 2005-02-23 19:02
标题: C语言中有没有sizeof()==1的指针?
Hanoi Tower可以不用栈和递归的。




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