C:将#defined字符串复制到结构数组中

时间:2012-10-09 14:42:44

标签: c string

我有一个结构:

//GUID structure
typedef struct {
    var8 octet[16];
} GPTGUID_t;

长#define为:

#define PTYPE_MRP_UPPER     0x4db80b5ce3c9e316ULL
#define PTYPE_MRP_LOWER     0xae1502f02df97d81ULL

我希望将八位字节0到7中的UPPER部分和8到15中的LOWER复制。 不幸的是,包括memcpy在内的所有尝试都失败了并给出了段错误。

我试了一下:

        strcpy(guid.octet[0], PTYPE_MRP_UPPER);
        strcpy(guid.octet[8], PTYPE_MRP_LOWER);

而且,

memcpy(guid.octet[0], PTYPE_MRP_UPPER, sizeof(PTYPE_MRP_UPPER));
memcpy(guid.octet[8], PTYPE_MRP_LOWER, sizeof(PTYPE_MRP_LOWER));

两者都失败了。请帮我。

正如旁注:

typedef unsigned char       var8;
typedef unsigned short      var16;
typedef unsigned int        var32;

但是,我能够将单个八位字节提取为:

    memcpy( guid.octet, pHdr->partTypeGUID, sizeof(GPTGUID_t));//copy the partitionTypeGUID
    p1 = getvar64(guid.octet[0]);
    p2 = getvar64(guid.octet[8]);

其中,#define getvar64(x) (*(var64*)(&x))

4 个答案:

答案 0 :(得分:5)

0x4db80b5ce3c9e316ULL不是字符串,因此strcpy将其视为一个指针并且具有类似于指向方式错误的值。

在找到零字节(字符strcpy)之前,您也不能使用'\0'进行复制。请改用memcpy

您也不会将指针传递给memcpy函数,而是传递值。您应该打开更多警告,因为编译器喜欢它,但不足以使它显然成为错误。

尝试像这样呼叫memcpy

unsigned long long val;

val = PTYPE_MRP_UPPER;
memcpy(&guid.octet[0], &val, sizeof(val));
val = PTYPE_MRP_LOWER;
memcpy(&guid.octet[8], &val, sizeof(val));

答案 1 :(得分:1)

这些不是内存部分,这些是数字:为什么不使用掩码?

int i;
unsigned long long mask = 0xff00000000000000;
for (i = 0; i < 8; i++)
{
  guid.octet[i] = (PTYPE_MRP_UPPER & mask) >> ((7 - i) * 8);
  guid.octet[i+8] = (PTYPE_MRP_LOWER & mask) >> ((7 - i) * 8);
  mask >>= 8;
}

答案 2 :(得分:0)

你可以使用联盟:

//GUID structure
typedef struct {
    union {
        var8 octet[16];
        uint64_t qword[2];
    };
} GPTGUID_t;

// This copies the bytes in native-endian order; do an endian swap if you need
// non-native order
guid.qword[0] = PTYPE_MRP_UPPER;
guid.qword[1] = PTYPE_MRP_LOWER;

请注意,这是一个匿名联合,这是C11语言标准的一个特性,但它也在许多C89 / C99编译器中实现为语言扩展;如果您的编译器不支持,那么您必须改为使用命名的union。

或者,如果您不能或不想修改GPTGUID_t的定义,则应该一次只复制一个字节:

// This stores the bytes in big-endian order
guid.octet[0] = (var8)(PTYPE_MRP_UPPER >> 56);
guid.octet[1] = (var8)(PTYPE_MRP_UPPER >> 48);
guid.octet[2] = (var8)(PTYPE_MRP_UPPER >> 40);
guid.octet[3] = (var8)(PTYPE_MRP_UPPER >> 32);
guid.octet[4] = (var8)(PTYPE_MRP_UPPER >> 24);
guid.octet[5] = (var8)(PTYPE_MRP_UPPER >> 16);
guid.octet[6] = (var8)(PTYPE_MRP_UPPER >> 8);
guid.octet[7] = (var8)(PTYPE_MRP_UPPER);
guid.octet[8] = (var8)(PTYPE_MRP_LOWER >> 56);
guid.octet[9] = (var8)(PTYPE_MRP_LOWER >> 48);
guid.octet[10] = (var8)(PTYPE_MRP_LOWER >> 40);
guid.octet[11] = (var8)(PTYPE_MRP_LOWER >> 32);
guid.octet[12] = (var8)(PTYPE_MRP_LOWER >> 24);
guid.octet[13] = (var8)(PTYPE_MRP_LOWER >> 16);
guid.octet[14] = (var8)(PTYPE_MRP_LOWER >> 8);
guid.octet[15] = (var8)(PTYPE_MRP_LOWER);

答案 3 :(得分:-2)

实际上是0x4db80b5ce3c9e316ULL和0xae1502f02df97d81ULL? 似乎您在特定地址随机复制数据。

顺便说一句,如果你实际上正在处理字符串,

#define PTYPE_MRP_UPPER     "0x4db80b5ce3c9e316ULL"
#define PTYPE_MRP_LOWER     "0xae1502f02df97d81ULL"

应该做的伎俩。 (即使我不知道你真正想用这些价值做什么)