将char数组元素复制为short的最佳方法是什么?
假设我们有 -
char arr[5] = {'1','2','3','4','5'};
unsigned short *value = 0;
1)*value = (unsigned short*) arr[4];
2)*value = *((unsigned short *) ((void *) &arr[4]));
3)拿一个临时变量 -
unsigned short temp;
memcpy( &temp, &arr[4], sizeof( temp) );
*value = temp;`
此外,第二个选项是给出分段错误。
答案 0 :(得分:0)
这似乎是一系列随机猜测。
value = &temp;
*value = arr[4];
可能符合您既定的目标;
答案 1 :(得分:0)
2和3将从您的数组中复制2个字节,这将导致您从char数组末尾的未知内存中复制。
在1中,您正在将指针从值转换为未知区域。
你应该这样做:* value =(unsigned short)arr [4];
ie:将char值转换为unsigned short,然后将其复制到whereever值指向(希望它是一个有效的指针)
编辑:你的指针的值为0 ......所以它应该是:
unsigned short value = (unsigned short) arr[4];
答案 2 :(得分:0)
正确的代码将显示为
char arr[5] = {'1','2','3','4','5'};
unsigned short *value = new unsigned short( arr[4] );
或者
char arr[5] = {'1','2','3','4','5'};
unsigned short *value = new unsigned short;
*value = arr[4];
考虑到系统中的char
类型可以表现为signed char
。因此,在一般情况下,而不是上述声明,您可能需要以下
char arr[5] = {'1','2','3','4','5'};
unsigned short *value = new unsigned short( ( unsigned char )arr[4] );
虽然在你的例子中' 5'是一个正值,两个代码片段之间没有区别。
此外,如果您想存储值5而不是' 5'在unsigned short类型的对象中,你应该写
char arr[5] = {'1','2','3','4','5'};
unsigned short *value = new unsigned short( arr[4] - '0' );
或者
char arr[5] = {'1','2','3','4','5'};
unsigned short *value = new unsigned short;
*value = arr[4] - '0';
答案 3 :(得分:0)
实际上它是未定义的行为,因为您将Char转换为Short并且不确定将存储在word中的第一个字节是什么。手段也将取决于endian术语。