3

我是 C 编程新手。在解决我的一项课堂作业时,我遇到了以下代码片段。我不明白它的作用。

谁能告诉我以下C语法的含义是什么,

((char *)0 +1) or ((int*)0 +1))
4

3 回答 3

6

(char *) 0部分在地址 0 处创建一个指向字符数据的指针。该地址随后加 1,触发未定义的行为,因为指向地址 0 的指针(在 C 中也称为NULL)不能用于指针算术。第二部分做同样的事情,但指向整数数据的指针。

如果编译器只是将NULL地址视为地址(这是常见的,但同样不是必需的,这就是为什么这是未定义的行为),如果从数字上看,结果地址将不一样,因为 C 中的指针算术是根据指向的类型,通常是sizeof (int) > sizeof (char).

于 2013-06-26T09:22:29.790 回答
1

谁能告诉我以下C语法的含义是什么,

((char *)0 +1) or ((int*)0 +1))

C标准的条款没有任何内容,因为它没有定义。此代码在 C 编译器的一部分上调用未定义的行为。让我解释:

在 C 中,每个指针都可能指向指针取消引用的某个类型的对象,或者它可能是 0,然后称为空指针。空指针不能用于→指针算术

请注意,金属上空指针的实际表示,即变量在机器上的位可能与全零不同。但是在 C 方面,空指针总是比较等于值 0 的整数。此外,根据定义,不同类型的空指针也比较相等。然而,不同类型的非空指针的比较会调用未定义的行为。您也可以将任何指针转换为void*指针,然后返回。您还可以将每个指针强制转换为整数类型uintptr_t并返回。但是从指向 A 类型的指针转​​换为 B 类型的指针(其中 B 不是void*)会调用未定义的行为。

但是,特殊函数malloc由 C 语言规范定义,以返回void*可以转换为任何指针类型的指针。但是假设您使用它为数组分配一些内存,然后再将其强制char转换为intthis 会调用未定义的行为。

现在你可能会问:“什么是未定义的行为?”。好吧,这只是意味着,语言标准没有定义它,实现者可以以任何认为合适的方式去做。在大多数平台上,编写类似((char*)0 + 1)这样的东西可能会做一些天真的预期的事情(创建一个指针,指向地址 1),但它也可能让编译器构建一个人工智能,它首先在街上追你,然后获得意识,最后采取在世界范围内,将人类变成电池。所以要小心你的所作所为;)

于 2013-06-26T09:53:11.590 回答
-1

在 C 语言中,您必须告诉编译器您要使用哪种类型,这称为“强制转换”。例如:

char *c; //define c as "char pointer" (pointer to char)
c = ((char *)0 + 1); //this casts "0 + 1" to "char pointer" type, in this example not strictly necessary but adds some clarification to code
于 2013-06-26T09:34:52.363 回答