我是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);
返回的原因是为了让人们能够以这种方式使用转换。
答案 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 *几乎肯定是在程序存储空间之外的地址