c ++ cast void * to int error

时间:2015-07-02 09:56:11

标签: c++ c pointers casting

我是C / C ++的新手,我正在尝试使用定义数据结构PDS的C库,并提供访问数据的方法。

这是我用来访问它的函数:

void **pD

它基本上返回元素的键,元素的类型,元素的大小和元素的实际数据。 char *key = NULL; PDS_TYPE type; size_t size; void *data = NULL; float f; pdsRewind(myPDS); while (pdsGetNext(myPDS, &key, &type, &size, &data) == PDS_ERR_NONE) { switch (type) { case PDS_TYPE::PDS_I: // this is integer printf("INT: %d\n", *((int*)data)); printf("INT PRINTED AS STRING: %s\n", (int*)data); printf("INT AS STRING: %s\n", (char*)data); break; case PDS_TYPE::PDS_PCH: //this is null terminated string printf("STRING: %s\n", (char*)data); break; default: break; } } 在文档中描述如下:“指向地址的指针,它获取实际元素。”。

我正在尝试将数据转换为适当的类型,如“PDStype”所示。我在将数据转换为整数时遇到问题,这里是示例代码:

INT: 55
INT PRINTED AS STRING: 7
INT AS STRING: 7

整数的实数值为7,输出如下:

void *ptr = (char*)malloc(sizeof(o))

对我来说,似乎第一个,我想成为“7”,如果我将像*((int*)ptr)这样的void指针进行malloced然后尝试将其转换为int,那将会打印出来。比如void*

我的问题是:在将它投射到int时,我有什么问题吗?据我所知,数据作为YourClass.class.getResourceAsStrem(/file.xxxx); 返回的原因是为了让人们能够以这种方式使用转换。

2 个答案:

答案 0 :(得分:0)

55是" 7"的ascii值。 http://www.asciitable.com/

在C:

int a = atoi(data);

在C ++ 11中:

int myint1 = std::stoi(data);

因为你在C ++中使用数据是空的*做一个reinterpret_cast<char*>(data); 那样:

int myint1 = std::stoi(reinterpret_cast<char*>(data));

在C:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    // to get a void* like you
    char *tmp = "7";
    void *data = (void*)tmp;

    // what is matter for you
    int a = atoi((char*)data);
    printf("a = %d\n", a);
    return 0;
}

在C ++ 11中:

include <iostream>

int main()
{
    // to get a void* with "7" like you we could get the same with a std::string
    char *tmp = new char [1]();
    tmp[0] = '7';
    void * data = reinterpret_cast<void*>(tmp);

    // what is matter for you
    int a = std::atoi(reinterpret_cast<char*>(data));
    std::cout << "a = " << a << std::endl;
    return 0;
}

答案 1 :(得分:0)

当你说&#34;将char *转换为int&#34;你给出了一个没有明确定义的规范&#34;,因为char *意味着提供与int完全不同的语义。

当你&#34;强迫&#34;演员,你在不同的语义下重新解释相同的位模式。当你&#34;转换&#34;一个值,您正在将位模式更改为另一个保留语义的方式。

现在,字符文字(和字符串文字)意味着&#34;可读文字&#34;:'7'7不同,7+2为{ {1}},但9'7'+'2'

那是因为+是整数运算,&#39; 7&#39;是53岁,&#39; 2&#39;是48和101是&#39;。

现在,你有一段记忆,你在其中放置了值&#39; 7&#39; (这是与整数53相对应的相同位模式:内存本身不可用于键入语义:它只包含00110101),其地址称为'e'

现在,由于void*如何工作,%d需要int,并使用数字语义,而%s需要char *并使用文本语义。

根据这些规范,您将阅读作为第二个参数的所有内容。

在您的第一种情况下,您使用printf,使用它,因为它是您尊重的void*(通过粗心int*)获取对应于00110101的int值,即53 ,并将此文件提供给printf,将其视为一个数字,并将其转换为显示的文本(&#34; 53&#34;)。

在第三种情况下,您将*视为void*,并将其作为&#34;字符序列&#34;将其读取为printf(因为%s)。 ,从而印刷&#34; 7&#34;。

在你的第二种情况下,你接受一个int *并将它交给printf,在那里它需要一个char *(因为%s,它就这样对待它),因此仍然给你&#34; 7&#34 ;。

如果要将值char*(文本)转换为数字"7"(整数),则必须使用7之类的函数并打印返回的值(现在是一个整数),&#34;%d&#34;。使用%s会崩溃,因为atoi被视为char *几乎肯定是在程序存储空间之外的地址