尝试将double转换为char *时出错

时间:2017-02-03 20:11:43

标签: c

我的项目是扫描地址空间(在我的情况下是0x00000000 - 0xffffffff,或0 - (2 32 ) - 1)用于模式并在数组中返回内存中的位置找到模式的地方(可以多次找到)。

由于地址空间是32位,i是double,max是pow(2,32)(也是double)。

我想保持i的原始值不变,以便我可以使用它来报告找到模式的位置(因为实际上找到模式需要向前移动几个字节),所以我想要temp,声明作为char *,复制i的值。然后,在我的程序中,我将取消引用temp。

if exist %var% (
  del %var%
) else (
  echo The file doesn't exist. Check for errors and try again.
)

我遇到的问题是双重不能被视为char *。一个int可以是;但是,由于地址空间是32位(而不是16位),我需要一个double,它足够大,足以代表2 ^ 32。

我能做些什么吗?

4 个答案:

答案 0 :(得分:4)

在C中,doublefloat并不代表您认为的方式;此代码演示了:

#include <stdio.h>

typedef union _DI
{
    double d;
    int i;
} DI;

int main()
{
    DI di;
    di.d =  3.00;
    printf("%d\n", di.i);
    return 0;
}

在这种情况下,您不会看到3的输出。

一般情况下,即使您可以阅读其他流程&#39;记忆,你的策略不会在任何现代操作系统上工作,因为虚拟内存(一个进程的地址空间&#34;看到&#34;不一定(事实上,它通常不会) )表示系统上的物理内存。)

答案 1 :(得分:3)

永远不要使用浮点变量来存储整数。浮点变量进行近似计算。它会碰巧在这种情况下工作,因为整数足够小,但要知道,你需要了解浮点如何在特定的机器/编译器上工作以及你将使用的整数范围。而且编写程序更难,而且程序会更慢。

C定义了一个足以存储指针的整数类型:uintptr_t。您可以将指针转换为uintptr_t并返回。在32位机器上,uintptr_t将是32位类型,因此它只能存储最多2 32 -1的值。要表示涵盖包括第一个和最后一个值的整个类型范围的循环,您不能使用带有变量的普通for循环,因为结束条件需要循环的值指数超出范围。如果你天真地写

uintptr_t i;
for (i = 0; i <= UINTPTR_MAX; i++) {
    unsigned char *temp = (unsigned char *)i;
    // ...
}

然后你得到一个无限循环,因为在i等于UINTPTR_MAX的迭代之后,运行i++i的值包装为0.事实是loop是无限的也可以用更简单的逻辑方式看出:条件i <= UINTPTR_MAX总是为真,因为该类型的所有值都小于或等于最大值。

你可以通过在增加变量之前将测试放在循环的末尾附近来解决这个问题。

i = 0;
do {
    unsigned char *temp = (unsigned char *)i;
    // ...
    if (i == UINTPTR_MAX) break;
    i++;
} while (1);

请注意,如果你能做到这一点,以这种方式探索4GB会非常慢。每当您尝试访问未映射的地址时,您都会遇到分段错误。您可以使用信号处理程序处理段错误,但这很棘手和缓慢。您尝试过的可能会或可能不是您的老师所期望的,但它没有任何实际意义。

要在Linux上探索进程的内存,请阅读/proc/self/maps以发现其内存映射。有关Python中的一些示例代码,请参阅my answer on Unix.SE

另请注意,如果您正在寻找模式,则需要考虑整个模式的长度,逐字节查找并不能完成整个工作。

答案 2 :(得分:2)

啊,一个学校作业。那好吧。

 import { Component } from '@angular/core';

import { NavController } from 'ionic-angular';

@Component({
  selector: 'page-home',
  templateUrl: 'home.html'
})
export class HomePage {

  constructor(public navCtrl: NavController) {

  }

}

答案 3 :(得分:2)

double对指针的强制转换是违反约束的 - 因此是错误。

  

不应将浮动类型转换为任何指针类型。 C11dr§6.5.44

要扫描整个32位地址空间,请使用do循环,其整数类型的[0 ... 0xFFFFFFFF]范围。

uint32_t address = 0;
do {
  char *p = (char *) address;
  foo(p);
} while (address++ < 0xFFFFFFFF);