繁体   English   中英

C编程中的(int)是什么意思

[英]what does (int) mean in C programming

void problem3(void) {
    int overflowme[16];
    int x = (int) problem3; // x is the address of the first instr for problem3
    printf("hello world\n");
    overflowme[17] = x; 

我想知道(int)在C编程中做了什么。

这是一个类型转换,告诉编译器“忽略问题3真正具有的类型,并将其作为一个int类型处理”。

在此示例中,problem3具有函数指针类型,因此通常编译器将拒绝该程序(当期望整数时使用函数指针通常是程序员错误)。 类型转换强迫一种不同的解释 - 程序员踩着并说“我知道我在做什么”。

这是一个明确的演员。 您将problem3的值转换为整数,然后将该整数值分配给x。

请注意,这实际上并不会更改problem3的值。

它是一个类型转换 - 它是将操作数的类型(在您的示例中为problem3 )转换为另一种类型的形式。

在C(和C ++中使用'C风格的强制转换)时,强制转换可以执行以下几种操作之一:

  • 什么也不做,只改变某些东西的类型,而不改变数据的形式。 例如,当您将指针强制转换为int时。
  • 执行转换作为强制转换操作的一部分。 例如,当将float转换为int时,数据实际上是从用于表示浮点值(通常是指数/尾数形式)的表单转换为普通的旧整数(丢失任何小数部分)

因为不同形式的转换可能会令人困惑或不清楚发生了什么(或打算发生什么),C ++添加了几个特定的​​转换运算符:

  • reinterpret_cast<>() ,它对应于上述第一种形式
  • static_cast<>()对应于第二种形式(即使转换不会导致内部数据格式发生变化)
  • const_cast<>()这是一个特殊的转换案例,它能够删除可能应用于对象的constvolatile限定符
  • dynamic_cast<>() ,它对C ++来说是全新的,在C中没有类似的功能。此运算符用于将基础对象类型安全地'向下'转换为其派生类型之一。

因为它们天生就是危险的,所以演员通常被认为是不好的形式。 执行强制转换操作时,您将破坏编译器执行类型检查的能力。 但是,有时候它可能是必要的或非常有用的,你会看到它经常在C代码中使用。

在您的示例中, problem3是指向函数的指针,并且problem3转换将该函数的地址“转换”为int。 然后它将address-as-int存储到数组中,但实际上是一个数组元素超过了数组的末尾(这是一个禁忌)。 在许多平台上,无效的数组元素是存储函数的返回地址的位置,所以会发生什么是当problem3()函数返回时,它将返回自身并再次运行(ad-infinitum - sort of)。

它最终会使堆栈下溢,因为问题problem3()的新的'黑客'运行将没有一个函数调用,它将一个返回地址放在堆栈上 - 它只会problem3()堆栈之前的任何其他内容并return再一次,重复该过程,直到堆栈下溢,这可能会导致处理器异常。

这意味着在分配给int x之前, problem3被转换为int类型

这是一个类型,即。 它将后面的变量/常量转换为指定的类型。 这里,void(*)(void)类型被转换为int(大括号中的东西)

正如其他人所指出的那样,这只是明确的演员 它只是将变量类型更改为int类型。

但是从你发布的代码看起来这个函数正在为某种缓冲区溢出做准备。 这个功能的其余部分是什么?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM