A小小鸟 发表于 2020-1-8 15:24:53

求解连个程序哪个对那个错啊??

本帖最后由 A小小鸟 于 2020-1-9 11:11 编辑

问题是:模拟实现CE的数据搜索功能:                                                                                       
        这一堆数据中存储了角色的血值信息,假设血值的类型为int类型,值为100(10进制)                                       
        请列出所有可能的值以及该值对应的地址.                                                                               
        0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x09,                                       
        0x00,0x20,0x10,0x03,0x03,0x0C,0x00,0x00,0x44,0x00,                                       
        0x00,0x33,0x00,0x47,0x0C,0x0E,0x00,0x0D,0x00,0x11,                                       
        0x00,0x00,0x00,0x02,0x64,0x00,0x00,0x00,0xAA,0x00,                                       
        0x00,0x00,0x64,0x10,0x00,0x00,0x00,0x00,0x00,0x00,                                       
        0x00,0x00,0x02,0x00,0x74,0x0F,0x41,0x00,0x00,0x00,                                       
        0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,                                       
        0x00,0x02,0x74,0x0F,0x41,0x00,0x06,0x08,0x00,0x00,                                       
        0x00,0x00,0x00,0x64,0x00,0x0F,0x00,0x00,0x0D,0x00,                                       
        0x00,0x00,0x23,0x00,0x00,0x64,0x00,0x00,0x64,0x00                                       
我写了两个程序,但是结果输出却不一样,不知道哪个对那个错啊?错在哪里了?求大神能指点一下,谢谢了

人造人 发表于 2020-1-8 15:46:59

发代码

人造人 发表于 2020-1-8 15:52:55

绝大多数软件都会进行字节对齐,32位环境,int应该是4字节对齐的,没有必要一个字节一个字节的找

人造人 发表于 2020-1-8 16:02:23

我大概看了一下
两个程序应该都是对的
输出结果不同是因为输出的地址是相对于整个程序的地址,而不是相对于arr的地址

即使arr是全局变量,编译器好像也不保证两次链接后地址一样

jackz007 发表于 2020-1-8 16:38:16

#include <stdio.h>
main(void)
{
      unsigned char data[] = {
      0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x09,\
      0x00,0x20,0x10,0x03,0x03,0x0C,0x00,0x00,0x44,0x00,\
      0x00,0x33,0x00,0x47,0x0C,0x0E,0x00,0x0D,0x00,0x11,\
      0x00,0x00,0x00,0x02,0x64,0x00,0x00,0x00,0xAA,0x00,\
      0x00,0x00,0x64,0x10,0x00,0x00,0x00,0x00,0x00,0x00,\
      0x00,0x00,0x02,0x00,0x74,0x0F,0x41,0x00,0x00,0x00,\
      0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,\
      0x00,0x02,0x74,0x0F,0x41,0x00,0x06,0x08,0x00,0x00,\
      0x00,0x00,0x00,0x64,0x00,0x0F,0x00,0x00,0x0D,0x00,\
      0x00,0x00,0x23,0x00,0x00,0x64,0x00,0x00,0x64,0x00 }                                                                                                             ;
      union {
            unsigned char      b1                                                                                                                                       ;
            unsigned short   b2                                                                                                                                       ;
            unsigned int       b4                                                                                                                                       ;
            unsigned long long b8                                                                                                                                       ;
      } * p                                                                                                                                                         ;
      int d , k                                                                                                                                                       ;
      for(k = 0 ; k < 100 ; k ++) if(data == 100) printf(" Byte : [%d] = 100\n" , k)                                                                               ;
      for(d = 0 ; d < 2 ; d ++) for(k = d , p = (void *) & data ; k < 100 ; k += 2 , p = (void *) & data) if(p -> b2 == 100) printf(" Word : [%d] = 100\n" , k) ;
      for(d = 0 ; d < 4 ; d ++) for(k = d , p = (void *) & data ; k < 100 ; k += 4 , p = (void *) & data) if(p -> b4 == 100) printf("DWord : [%d] = 100\n" , k) ;
      for(d = 0 ; d < 8 ; d ++) for(k = d , p = (void *) & data ; k < 100 ; k += 8 , p = (void *) & data) if(p -> b8 == 100) printf("QWord : [%d] = 100\n" , k) ;
}
      编译、运行实况:
C:\Bin>cl x.c
用于 80x86 的 Microsoft (R) 32 位 C/C++ 优化编译器 16.00.30319.01 版
版权所有(C) Microsoft Corporation。保留所有权利。

x.c
Microsoft (R) Incremental Linker Version 10.00.30319.01
Copyright (C) Microsoft Corporation.All rights reserved.

/out:x.exe
x.obj

C:\Bin>x
Byte : = 100
Byte : = 100
Byte : = 100
Byte : = 100
Byte : = 100
Word : = 100
Word : = 100
Word : = 100
Word : = 100
DWord : = 100

C:\Bin>

A小小鸟 发表于 2020-1-9 11:08:26

本帖最后由 A小小鸟 于 2020-1-9 11:09 编辑

人造人 发表于 2020-1-8 16:02
我大概看了一下
两个程序应该都是对的
输出结果不同是因为输出的地址是相对于整个程序的地址,而不是相对 ...

这道题就是直接在定义的数组里面去找,上面的1.jpj发错了,我其实发的是这个,求姐姐看一下,为什么同一个数组,同一个编译器,却找出来两个地址,这应该是不可能的吧

A小小鸟 发表于 2020-1-9 11:10:56

jackz007 发表于 2020-1-8 16:38
编译、运行实况:

我想知道,我的程序是哪里出问题了,我的1.jpj发错了,我其实发的是这个,你看看啊{:5_91:}

A小小鸟 发表于 2020-1-9 11:12:59

人造人 发表于 2020-1-8 15:46
发代码

代码函数部分全部拍下来了,没有缺失的了{:5_91:}

人造人 发表于 2020-1-9 11:40:11

A小小鸟 发表于 2020-1-9 11:12
代码函数部分全部拍下来了,没有缺失的了

代码复制粘贴的那种
我不想看着图片抄一遍代码,我需要代码,需要调试

quark 发表于 2020-1-9 13:50:27

学习下。。。

A小小鸟 发表于 2020-1-9 14:28:08

人造人 发表于 2020-1-9 11:40
代码复制粘贴的那种
我不想看着图片抄一遍代码,我需要代码,需要调试

OK,不好意思啊,代码是下面两个
第一个
#include "stdafx.h"
char arr={
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x09,                                       
0x00,0x20,0x10,0x03,0x03,0x0C,0x00,0x00,0x44,0x00,                                       
0x00,0x33,0x00,0x47,0x0C,0x0E,0x00,0x0D,0x00,0x11,                                       
0x00,0x00,0x00,0x02,0x64,0x00,0x00,0x00,0xAA,0x00,                                       
0x00,0x00,0x64,0x10,0x00,0x00,0x00,0x00,0x00,0x00,                                       
0x00,0x00,0x02,0x00,0x74,0x0F,0x41,0x00,0x00,0x00,                                       
0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,                                       
0x00,0x02,0x74,0x0F,0x41,0x00,0x06,0x08,0x00,0x00,                                       
0x00,0x00,0x00,0x64,0x00,0x0F,0x00,0x00,0x0D,0x00,                                       
0x00,0x00,0x23,0x00,0x00,0x64,0x00,0x00,0x64,0x00                                       
};
void function()
{
        char* p1=arr;
        for(int i=0;i<100;i++)
        {
                if(*((int*)p1)==0x64)
                {
                        printf("%x\n",p1);
                        printf("%x\n",*(p1));
                }
                p1=p1+1;
        }
}
int main(int argc, char* argv[])
{
        function();
        return 0;
}
第二个

#include "stdafx.h"
char arr={
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x09,                                       
0x00,0x20,0x10,0x03,0x03,0x0C,0x00,0x00,0x44,0x00,                                       
0x00,0x33,0x00,0x47,0x0C,0x0E,0x00,0x0D,0x00,0x11,                                       
0x00,0x00,0x00,0x02,0x64,0x00,0x00,0x00,0xAA,0x00,                                       
0x00,0x00,0x64,0x10,0x00,0x00,0x00,0x00,0x00,0x00,                                       
0x00,0x00,0x02,0x00,0x74,0x0F,0x41,0x00,0x00,0x00,                                       
0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,                                       
0x00,0x02,0x74,0x0F,0x41,0x00,0x06,0x08,0x00,0x00,                                       
0x00,0x00,0x00,0x64,0x00,0x0F,0x00,0x00,0x0D,0x00,                                       
0x00,0x00,0x23,0x00,0x00,0x64,0x00,0x00,0x64,0x00                                       
};
void function()
{
        char* p1=arr;
        for(int i=0;i<100;i++)
        {
                if(*(p1+4)==0x64)
                {
                        printf("%x\n",p1+4);
                        printf("%x\n",*(p1+4));
                }
                p1=p1+1;
        }
}
int main(int argc, char* argv[])
{
        function();
        return 0;
}

麻烦姐姐帮我看一下两种代码哪个是对的,谢谢啦

人造人 发表于 2020-1-9 15:27:23

A小小鸟 发表于 2020-1-9 14:28
OK,不好意思啊,代码是下面两个
第一个
#include "stdafx.h"


#include <stdio.h>

char arr = {
        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x07, 0x09,
        0x00, 0x20, 0x10, 0x03, 0x03, 0x0C, 0x00, 0x00, 0x44, 0x00,
        0x00, 0x33, 0x00, 0x47, 0x0C, 0x0E, 0x00, 0x0D, 0x00, 0x11,
        0x00, 0x00, 0x00, 0x02, 0x64, 0x00, 0x00, 0x00, 0xAA, 0x00,
        0x00, 0x00, 0x64, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x02, 0x00, 0x74, 0x0F, 0x41, 0x00, 0x00, 0x00,
        0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00,
        0x00, 0x02, 0x74, 0x0F, 0x41, 0x00, 0x06, 0x08, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x64, 0x00, 0x0F, 0x00, 0x00, 0x0D, 0x00,
        0x00, 0x00, 0x23, 0x00, 0x00, 0x64, 0x00, 0x00, 0x64, 0x00
};

void function()
{
        char* p1 = arr;
        for(int i = 0; i < 100; i++)
        {
                printf("%d\n", p1 - arr);
                if(*((int*)p1) == 0x64)
                {
                        //printf("%x\n", p1);
                        //printf("%x\n", *(p1));
                }
                p1 = p1 + 1;
        }
}

int main(int argc, char* argv[])
{
        function();
        return 0;
}

/*

86
87
88
89
90
91
92
93
94
95
96
97
98
99
请按任意键继续. . .

*/


两个都不对,可以看到输出的最后一个是 99
也就是最后一次 *((int*)p1) 访问的是 99 100 101 102
明显数组越界访问

A小小鸟 发表于 2020-1-9 19:49:41

人造人 发表于 2020-1-9 15:27
两个都不对,可以看到输出的最后一个是 99
也就是最后一次 *((int*)p1) 访问的是 99 100 101 102
...

可是我的指针只加了100次,我代码意思是int类型的100,因为数组是char型的,所以,要四个字节来比较 ,但是指针搜索,不能四个字节为一组的比较,例如第一个是0x00,0x01,0x02,0x03来比较1是不是100,然后指针下次应该从0x01开始,0x01,0x02,0x03,0x04再来比较的,我的代码应该怎么优化啊{:5_91:}

人造人 发表于 2020-1-9 20:22:15

A小小鸟 发表于 2020-1-9 19:49
可是我的指针只加了100次,我代码意思是int类型的100,因为数组是char型的,所以,要四个字节来比较 ,但 ...

你的代码数组越界访问了

人造人 发表于 2020-1-9 20:29:06

A小小鸟 发表于 2020-1-9 19:49
可是我的指针只加了100次,我代码意思是int类型的100,因为数组是char型的,所以,要四个字节来比较 ,但 ...

看到没有,搜索结果竟然取决于全局变量a的值,a为0时搜索结果是2个,a为1时搜索结果是1个,都说你数组越界访问了


人造人 发表于 2020-1-9 20:42:16

jackz007 发表于 2020-1-8 16:38
编译、运行实况:

你也一样,数组越界访问



jackz007 发表于 2020-1-9 21:14:48

本帖最后由 jackz007 于 2020-1-9 21:26 编辑

人造人 发表于 2020-1-9 20:42
你也一样,数组越界访问

      多谢提醒,疏忽了。
#include <stdio.h>
main(void)
{
      unsigned char data[] = {
      0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x09,\
      0x00,0x20,0x10,0x03,0x03,0x0C,0x00,0x00,0x44,0x00,\
      0x00,0x33,0x00,0x47,0x0C,0x0E,0x00,0x0D,0x00,0x11,\
      0x00,0x00,0x00,0x02,0x64,0x00,0x00,0x00,0xAA,0x00,\
      0x00,0x00,0x64,0x10,0x00,0x00,0x00,0x00,0x00,0x00,\
      0x00,0x00,0x02,0x00,0x74,0x0F,0x41,0x00,0x00,0x00,\
      0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,\
      0x00,0x02,0x74,0x0F,0x41,0x00,0x06,0x08,0x00,0x00,\
      0x00,0x00,0x00,0x64,0x00,0x0F,0x00,0x00,0x0D,0x00,\
      0x00,0x00,0x23,0x00,0x00,0x64,0x00,0x00,0x64,0x00 }                                                                                                                     ;
      union {
            unsigned char      b1                                                                                                                                             ;
            unsigned short   b2                                                                                                                                             ;
            unsigned int       b4                                                                                                                                             ;
            unsigned long long b8                                                                                                                                             ;
      } * p                                                                                                                                                                   ;
      int d , k                                                                                                                                                               ;
      for(k = 0 ; k < 100 ; k ++) if(data == 100) printf(" Byte : [%d] = 100\n" , k)                                                                                       ;
      for(d = 0 ; d < 2 ; d ++) for(k = d , p = (void *) & data ; k + d + 2 < 100 ; k += 2 , p = (void *) & data) if(p -> b2 == 100) printf(" Word : [%d] = 100\n" , k) ;
      for(d = 0 ; d < 4 ; d ++) for(k = d , p = (void *) & data ; k + d + 4 < 100 ; k += 4 , p = (void *) & data) if(p -> b4 == 100) printf("DWord : [%d] = 100\n" , k) ;
      for(d = 0 ; d < 8 ; d ++) for(k = d , p = (void *) & data ; k + d + 8 < 100 ; k += 8 , p = (void *) & data) if(p -> b8 == 100) printf("QWord : [%d] = 100\n" , k) ;
}
      编译、运行结果与前面完全相同

A小小鸟 发表于 2020-1-10 10:57:36

人造人 发表于 2020-1-9 20:29
看到没有,搜索结果竟然取决于全局变量a的值,a为0时搜索结果是2个,a为1时搜索结果是1个,都说你数组越 ...

哇,真是这样,求姐姐,告诉一下,我的代码应该怎么样改,能满足那种搜搜需要,就是对数组这样搜索,从第一个0x00开始 0x00,0x01,0x02,0x03四个字节比较,第二个从0x01开始,0x01,0x02,0x03,0x04,再次四个字节比较,感觉有点遇到瓶颈了,本以为写的已经符合要求和逻辑了,没想到居然越界了,心慌慌啊{:10_266:}

A小小鸟 发表于 2020-1-10 11:00:29

jackz007 发表于 2020-1-9 21:14
多谢提醒,疏忽了。

      编译、运行结果与前面完全相同

题目虽然没说,但是老师要求,只用指针,不能用其他特定的结构,对数组这样搜索,从第一个0x00开始 0x00,0x01,0x02,0x03四个字节比较,第二个从0x01开始,0x01,0x02,0x03,0x04,再次四个字节比较,而你用了共用体,不行的,抱歉了{:10_266:}

jackz007 发表于 2020-1-10 11:24:11

本帖最后由 jackz007 于 2020-1-10 11:25 编辑

A小小鸟 发表于 2020-1-10 11:00
题目虽然没说,但是老师要求,只用指针,不能用其他特定的结构,对数组这样搜索,从第一个0x00开始 0x00, ...

      只用指针也没什么难度:
#include <stdio.h>
main(void)
{
      unsigned char data[] = {
      0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x09,\
      0x00,0x20,0x10,0x03,0x03,0x0C,0x00,0x00,0x44,0x00,\
      0x00,0x33,0x00,0x47,0x0C,0x0E,0x00,0x0D,0x00,0x11,\
      0x00,0x00,0x00,0x02,0x64,0x00,0x00,0x00,0xAA,0x00,\
      0x00,0x00,0x64,0x10,0x00,0x00,0x00,0x00,0x00,0x00,\
      0x00,0x00,0x02,0x00,0x74,0x0F,0x41,0x00,0x00,0x00,\
      0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,\
      0x00,0x02,0x74,0x0F,0x41,0x00,0x06,0x08,0x00,0x00,\
      0x00,0x00,0x00,0x64,0x00,0x0F,0x00,0x00,0x0D,0x00,\
      0x00,0x00,0x23,0x00,0x00,0x64,0x00,0x00,0x64,0x00 }                                                                                                            ;
      unsigned char      * p1                                                                                                                                        ;
      unsigned short   * p2                                                                                                                                        ;
      unsigned int       * p4                                                                                                                                        ;
      unsigned long long * p8                                                                                                                                        ;
      int d , k                                                                                                                                                      ;
      for(k = 0 , p1 = & data ; k < 100 ; k ++ , p1 ++) if(* p1 == 100) printf(" Byte : [%d] = 100\n" , k)                                                      ;
      for(d = 0 ; d < 2 ; d ++) for(k = d , p2 = (unsigned short *) & data ; k + 1 < 100 ; k += 2 , p2 ++) if(* p2 == 100) printf(" Word : [%d] = 100\n" , k)   ;
      for(d = 0 ; d < 4 ; d ++) for(k = d , p4 = (unsigned int *) & data ; k + 3 < 100 ; k += 4 , p4 ++) if(* p4 == 100) printf("DWord : [%d] = 100\n" , k)       ;
      for(d = 0 ; d < 8 ; d ++) for(k = d , p8 = (unsigned long long *) & data ; k + 7 < 100 ; k += 8 , p8 ++) if(* p8 == 100) printf("QWord : [%d] = 100\n" , k) ;
}
      编译、运行结果与前面完全相同
页: [1] 2
查看完整版本: 求解连个程序哪个对那个错啊??