【发布时间】:2013-04-10 23:32:34
【问题描述】:
我昨天发布了关于指向指针的指针等here 并决定将讨论移至新问题答案的 cmets 中。
我的问题是为什么编译器允许这种情况发生:
int *foo = malloc(sizeof(int));
*foo = 8;
int **********blarg = foo;
我收到了一些警告,但是当我像这样对 blarg 进行取消引用时:
*blarg;
它的值是 8。解引用不应该返回某种类型的空值吗?难道编译器不应该知道只有在取消引用之后,例如:
**********blarg;
是否有一个实际的整数值,任何较低级别的取消引用只会返回更多指向指针的指针?
Void 指针对我来说是一个全新的困惑,因为像这样的变量:
void *asdf;
可以指向以下任何类型:
int
char
float
*void
**********void
*******int
你明白了。
所以我的主要问题:
- 代码的第一个 sn-p 中到底发生了什么?那些指向指针的指针是否正在创建?
- 为什么取消引用在第二个 sn-p 代码中起作用?
- (听起来很愚蠢)如果我可以为任何东西分配任何值并且拥有 只要我正确阅读它就可以工作?
【问题讨论】:
-
谨慎的人不应该受到性能影响,因为它会检查每个取消引用。
-
编译器给了你一个警告。如果您的问题是,为什么编译器允许代码编译 - 使用
-Werror(gcc),它将不再编译,您将不再需要担心您的代码是否存在上述非法行为。 -
我想一个更好的问题是它甚至可以编译成什么才能运行?希望我有新的大会。
-
@chris:这不是编译时问题吗?
-
@recursive,我感觉到了一些编译时问题。我认为这个问题也包括运行时问题。
标签: c pointers gcc types dereference