【问题标题】:copy value of long long int to char array dynamically将 long long int 的值动态复制到 char 数组
【发布时间】:2014-07-06 15:46:41
【问题描述】:

我有一个类型为long long int 的变量名为iData

iData 从 1 计数到最大值。

我需要将此变量复制到 char 数组中。

我尝试了以下方法

long long int iData;
char cDataBuffer[8];

for(i=0;i<8;i++) {
  cDataBuffer[i]= (iData & 0XFF);
  iData = (iData >>8);
}

但我想将其存储在指针变量char *pDataBuffer中的动态变量中。

有人可以建议如何存储这个可变的 iData 可变长度。

【问题讨论】:

  • 顺便说一句,你总是得到 7 个零。您可能想使用iData &gt;&gt; 8
  • @Deduplicator:您的方法将iData 以主机字节顺序存储到cDataBuffer 中,可以是任何东西。 user3704068 的原始方法(Jongware 指出的更正)将确保 little-endian 字节顺序。
  • @user3704068:“我没有 Idata 的大小”是什么意思? iData 的大小始终为sizeof(iData);它不能改变。
  • @Deduplicator 这还不够,因为它通过违反严格的别名规则来调用未定义的行为。 不要通过向初学者推荐不良做法来传播不良做法!
  • @Deduplicator 不,阅读了该规则(例如,here)。如果您使用别名使用 char *(即char *p = (char *)&amp;foo,则可以,但如果您使用别名char *(或除已签名或未签名的@987654335 之外的任何其他内容)则可以@) 使用long long *(这正是你错误地建议的)。

标签: c pointers


【解决方案1】:

下面的逻辑会帮助你

long long int iData;
char *cDataBuffer;

cDataBuffer = malloc(sizeof(char) * sizeof(iData));

for (i = 0; i < sizeof(iData); i++) 
{
  cDataBuffer[i] = ((iData >> (i * 8)) & 0XFF);
}

【讨论】:

  • 另外,Don't cast the result of malloc (and friends)。无论如何,iData 周围的那些括号是没用的。而sizeof(char) * sizeof iData也很好奇。 sizeof(char) 通常表示某人不知道 sizeof 的含义。
  • @nix 不,那是错误的。 C 标准确实 要求 sizeof(char) 是一个。
  • 在这种情况下,最好的解决方案是 sizeof (*cDataBuffer)。
  • @nix this,又名 C99 6.5.3.4。
  • sizeof(char) 始终为 1(由 ANSI C 标准定义),而与 CHAR_BIT(在文件 limits.h 中定义)无关,它大多为 8,很少为 16。
【解决方案2】:

如果您不打算在任何地方更改该副本(即,如果您将其用于只读目的),那么这里有一个简单的解决方案,具有时间复杂度O(0):

char* pDataBuffer = (char*)&iData;

当然,如果iData是一个局部变量,那么你不能在函数外使用这个指针的值。

另外,请注意pDataBuffer[i] 在不同的Endian 架构上会有不同的解释。


如果您需要一份它的副本用于写入目的,那么您可以简单地使用函数memcpy,如下所示:

char* pDataBuffer = malloc(sizeof(iData));
memcpy(pDataBuffer,&iData,sizeof(iData);
return pDataBuffer;

如果可能的话,我强烈建议你在函数外静态分配,按需传递。

例如:

void SomeFunction()
{
    ...
    char aDataBuffer[sizeof(iData)];
    SomeOtherFunction(aDataBuffer);
    ...
}

void SomeOtherFunction(char* pDataBuffer)
{
    ...
    memcpy(pDataBuffer,&iData,sizeof(iData);
    ...
}

否则,您需要在稍后执行程序的某个时间点 free 分配的内存。

再次提醒,pDataBuffer[i] 在不同的 Endian 架构上会有不同的解释。

【讨论】:

  • 值得注意的是,这在相反的方向上不起作用(即给定char data[8],不能说long long *p = (long long *)data然后取消引用p。)
  • @user3477950:我同意这是一个很好的说明,尽管略有不同 - 在不支持未对齐加载/存储操作的架构上这样做是不安全的。
  • @Deduplicator 但这不是我要说的。当然*(char *)&amp;someLongLong = 42; 是有效的。无效的是分配大小为sizeof(long long) 的字符缓冲区,然后通过long long * 对其进行别名。
  • 嘘,你打败了我推荐使用 memcpy
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多