首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C中转换数值类型

在C中转换数值类型
EN

Stack Overflow用户
提问于 2009-12-26 05:41:42
回答 6查看 368关注 0票数 0

我试图用下面的代码找出这个问题的答案,但结果是,x = problem3;所指向的地狱指针的值( problem3的地址原来离函数的参数和局部变量太远了)……

代码语言:javascript
复制
void problem3(int a) {
    int overflowme[16];
    int x = problem3; 
    overflowme[15] = 102;
    printf(" the address of  x is %x\n the addres of the first local is %x\n the addres of the first para is %x\n ", x, &overflowme[15], &a);
}

int main(void) {
    problem3(101);
}

OUTPUT
 the address of  x is 42b613
 the addres of the first local is 12fed8
 the addres of the first para is 12fee4
 Press any key to continue . . .
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-12-26 05:48:14

你能解释一下为什么我们可以在上面的代码中赋值x=(

) problem3吗

因为problem3是一个函数指针(即函数的内存地址),并且所有指针都可以转换为整数。

我们不是要把"hello world“赋值给x吗?

不是的。但是,如果您想这样做(通过执行x = (int) "hello world";),也可以这样做,因为"hello world“也是一个指针(准确地说,是一个字符指针),所以上面的方法也适用。

票数 2
EN

Stack Overflow用户

发布于 2009-12-26 05:45:22

problem3是指向函数的指针。在C中,如果你使用像(int)这样的类型转换,编译器基本上会关闭所有类型检查,并假设你知道自己在做什么(即使,就像在本例中一样,这没有任何意义)-在这种情况下,将指针转换为整数。

底线--除非你真的真的需要,否则不要使用强制转换。

票数 4
EN

Stack Overflow用户

发布于 2009-12-26 05:50:36

在这种情况下,造型(当你把(int)放在某些东西前面时你正在做的事情)是很神奇的。它将接受任何类型的东西,并将其转换为其他任何类型的东西(在本例中为int ),无论它是否有任何意义。您应该避免使用强制转换,除非您绝对确定您必须这样做,并且没有其他方法。

程序的代码就像变量一样存在于内存中。这里发生的事情是,强制转换将表示代码在内存中所在位置的数字转换为整数。这个整数可以更大,也可以更小,这取决于编译器和链接器决定将函数代码放在内存中的什么位置。

printf语句根本不执行任何赋值操作。%x只是一个占位符,上面写着“接受传递给printf的一个参数,并在这里打印出来。”它是'x‘这一事实与程序中变量的名称无关。“x”表示“以16为基数(heXadecimal)打印此整数,而不是通常的以10为基数。”如果你放入%u%d,它仍然可以工作,并且你会得到以10为基数的无符号整数或以10为基数的有符号整数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1962017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档