正确访问内存位置以使用c中的union打印整数数组的元素

时间:2017-02-07 07:23:30

标签: c arrays unions

我不是如何使用联合在这里打印整数数组。请纠正我以解决问题。

正在正确打印val.str - ' + 100-100-100 + 760'并且输出数组的第一个元素似乎正确加载了值。然后覆盖相同的内存并打印一些垃圾值,这是我不知道如何解决的问题。

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

//Variable Decalartion
int i = 0, x = 100, y = -100, z = -100, p = 760;
int len_str;
char temp[4];

union Data{
   char str[16];
   unsigned int buff[8];
};

void Init(union Data val, unsigned int *dest);

int main(void){
   union Data val;
   unsigned int x[8];

   Init(val,x);
   for (i = 0; i < 8; i++) 
   {
     printf("0x%04X ",x[i]);
   }

   return 0;
}

void Init(union Data val, unsigned int *dest)
{
   len_str = sizeof(val.str);

   sprintf(temp,"%+04d",x);
   strcpy(val.str,temp);

   sprintf(temp,"%+04d",y);
   strcat(val.str,temp);

   sprintf(temp,"%+04d",z);
   strcat(val.str,temp);

   sprintf(temp,"%+04d",p);
   strcat(val.str,temp);

   printf("%s\n",val.str);
   printf("\n");

   for (i = 0; i < len_str+1; i += 2) 
   {
      val.buff[i / 2] = ((unsigned int)(unsigned char)val.str[i] << 8) |
                            (unsigned int)(unsigned char)val.str[i + 1];
      dest[i / 2] = val.buff[i / 2];                      
   }
}

显示的输出是

+100-100-100+760

0x2B31 0x401111C8 0x8049A58 0x8048782 0x0001 0xBFFB5E74 0xBFFB5E7C  0x401B0E4D

谢谢,

AKHIL

2 个答案:

答案 0 :(得分:1)

此代码中存在许多严重错误。

正如user694733所指出的那样,char temp[4];太小了。那里有缓冲区溢出。

您拨打此电话:Init(val,x);,其中包含val中的单位化数据。

请注意,sizeof int是特定于平台的。你似乎认为它是16bits? 在PC和现代ARM处理器上32bits。但在低端处理器上可能是16bits

答案 1 :(得分:-1)

最后我解决了,请找到代码,

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

//Variable Decalartion
int x = 1000, y = -1000, z = -1000, p = 760;
char temp[6];

union Data {
   char str[21];
   unsigned int buff[20];
};

void Init(union Data val);

int main(void){
   union Data val;
   Init(val);
   return 0;
}

void Init(union Data val)
{
   sprintf(temp,"%+05d",x);
   strcpy(val.str,temp);

   sprintf(temp,"%+05d",y);
   strcat(val.str,temp);

   sprintf(temp,"%+05d",z);
   strcat(val.str,temp);

   sprintf(temp,"%+05d",p);
   strcat(val.str,temp);

   printf("%s\n",val.str);
   printf("\n");

   printf("%s\n",val.buff);
   printf("\n");
}

输出,

+1000-1000-1000+0760

+1000-1000-1000+0760