鱼C论坛

 找回密码
 立即注册
查看: 4212|回复: 22

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

[复制链接]
发表于 2020-1-8 15:24:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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                                       
我写了两个程序,但是结果输出却不一样,不知道哪个对那个错啊?错在哪里了?求大神能指点一下,谢谢了
3.jpg
1.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-1-8 15:46:59 | 显示全部楼层
发代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-8 15:52:55 | 显示全部楼层
绝大多数软件都会进行字节对齐,32位环境,int应该是4字节对齐的,没有必要一个字节一个字节的找
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-8 16:02:23 | 显示全部楼层
我大概看了一下
两个程序应该都是对的
输出结果不同是因为输出的地址是相对于整个程序的地址,而不是相对于arr的地址

即使arr是全局变量,编译器好像也不保证两次链接后地址一样
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-8 16:38:16 | 显示全部楼层
  1. #include <stdio.h>
  2. main(void)
  3. {
  4.         unsigned char data[] = {
  5.         0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x09,\
  6.         0x00,0x20,0x10,0x03,0x03,0x0C,0x00,0x00,0x44,0x00,\
  7.         0x00,0x33,0x00,0x47,0x0C,0x0E,0x00,0x0D,0x00,0x11,\
  8.         0x00,0x00,0x00,0x02,0x64,0x00,0x00,0x00,0xAA,0x00,\
  9.         0x00,0x00,0x64,0x10,0x00,0x00,0x00,0x00,0x00,0x00,\
  10.         0x00,0x00,0x02,0x00,0x74,0x0F,0x41,0x00,0x00,0x00,\
  11.         0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,\
  12.         0x00,0x02,0x74,0x0F,0x41,0x00,0x06,0x08,0x00,0x00,\
  13.         0x00,0x00,0x00,0x64,0x00,0x0F,0x00,0x00,0x0D,0x00,\
  14.         0x00,0x00,0x23,0x00,0x00,0x64,0x00,0x00,0x64,0x00 }                                                                                                             ;
  15.         union {
  16.             unsigned char      b1                                                                                                                                       ;
  17.             unsigned short     b2                                                                                                                                       ;
  18.             unsigned int       b4                                                                                                                                       ;
  19.             unsigned long long b8                                                                                                                                       ;
  20.         } * p                                                                                                                                                           ;
  21.         int d , k                                                                                                                                                       ;
  22.         for(k = 0 ; k < 100 ; k ++) if(data[k] == 100) printf(" Byte : [%d] = 100\n" , k)                                                                               ;
  23.         for(d = 0 ; d < 2 ; d ++) for(k = d , p = (void *) & data[k] ; k < 100 ; k += 2 , p = (void *) & data[k]) if(p -> b2 == 100) printf(" Word : [%d] = 100\n" , k) ;
  24.         for(d = 0 ; d < 4 ; d ++) for(k = d , p = (void *) & data[k] ; k < 100 ; k += 4 , p = (void *) & data[k]) if(p -> b4 == 100) printf("DWord : [%d] = 100\n" , k) ;
  25.         for(d = 0 ; d < 8 ; d ++) for(k = d , p = (void *) & data[k] ; k < 100 ; k += 8 , p = (void *) & data[k]) if(p -> b8 == 100) printf("QWord : [%d] = 100\n" , k) ;
  26. }
复制代码

        编译、运行实况:
  1. C:\Bin>cl x.c
  2. 用于 80x86 的 Microsoft (R) 32 位 C/C++ 优化编译器 16.00.30319.01 版
  3. 版权所有(C) Microsoft Corporation。保留所有权利。

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

  7. /out:x.exe
  8. x.obj

  9. C:\Bin>x
  10. Byte : [34] = 100
  11. Byte : [42] = 100
  12. Byte : [83] = 100
  13. Byte : [95] = 100
  14. Byte : [98] = 100
  15. Word : [34] = 100
  16. Word : [98] = 100
  17. Word : [83] = 100
  18. Word : [95] = 100
  19. DWord : [34] = 100

  20. C:\Bin>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-9 11:08:26 | 显示全部楼层
本帖最后由 A小小鸟 于 2020-1-9 11:09 编辑
人造人 发表于 2020-1-8 16:02
我大概看了一下
两个程序应该都是对的
输出结果不同是因为输出的地址是相对于整个程序的地址,而不是相对 ...


这道题就是直接在定义的数组里面去找,上面的1.jpj发错了,我其实发的是这个,求姐姐看一下,为什么同一个数组,同一个编译器,却找出来两个地址,这应该是不可能的吧
1.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-9 11:10:56 | 显示全部楼层
jackz007 发表于 2020-1-8 16:38
编译、运行实况:

我想知道,我的程序是哪里出问题了,我的1.jpj发错了,我其实发的是这个,你看看啊
1.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-9 11:12:59 | 显示全部楼层

代码函数部分全部拍下来了,没有缺失的了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

代码复制粘贴的那种
我不想看着图片抄一遍代码,我需要代码,需要调试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-9 13:50:27 From FishC Mobile | 显示全部楼层
学习下。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-9 14:28:08 | 显示全部楼层
人造人 发表于 2020-1-9 11:40
代码复制粘贴的那种
我不想看着图片抄一遍代码,我需要代码,需要调试

OK,不好意思啊,代码是下面两个
第一个
#include "stdafx.h"
char arr[100]={
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[100]={
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;
}

麻烦姐姐帮我看一下两种代码哪个是对的,谢谢啦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-9 15:27:23 | 显示全部楼层
A小小鸟 发表于 2020-1-9 14:28
OK,不好意思啊,代码是下面两个
第一个
#include "stdafx.h"
  1. #include <stdio.h>

  2. char arr[100] = {
  3.         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x07, 0x09,
  4.         0x00, 0x20, 0x10, 0x03, 0x03, 0x0C, 0x00, 0x00, 0x44, 0x00,
  5.         0x00, 0x33, 0x00, 0x47, 0x0C, 0x0E, 0x00, 0x0D, 0x00, 0x11,
  6.         0x00, 0x00, 0x00, 0x02, 0x64, 0x00, 0x00, 0x00, 0xAA, 0x00,
  7.         0x00, 0x00, 0x64, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  8.         0x00, 0x00, 0x02, 0x00, 0x74, 0x0F, 0x41, 0x00, 0x00, 0x00,
  9.         0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00,
  10.         0x00, 0x02, 0x74, 0x0F, 0x41, 0x00, 0x06, 0x08, 0x00, 0x00,
  11.         0x00, 0x00, 0x00, 0x64, 0x00, 0x0F, 0x00, 0x00, 0x0D, 0x00,
  12.         0x00, 0x00, 0x23, 0x00, 0x00, 0x64, 0x00, 0x00, 0x64, 0x00
  13. };

  14. void function()
  15. {
  16.         char* p1 = arr;
  17.         for(int i = 0; i < 100; i++)
  18.         {
  19.                 printf("%d\n", p1 - arr);
  20.                 if(*((int*)p1) == 0x64)
  21.                 {
  22.                         //printf("%x\n", p1);
  23.                         //printf("%x\n", *(p1));
  24.                 }
  25.                 p1 = p1 + 1;
  26.         }
  27. }

  28. int main(int argc, char* argv[])
  29. {
  30.         function();
  31.         return 0;
  32. }

  33. /*

  34. 86
  35. 87
  36. 88
  37. 89
  38. 90
  39. 91
  40. 92
  41. 93
  42. 94
  43. 95
  44. 96
  45. 97
  46. 98
  47. 99
  48. 请按任意键继续. . .

  49. */
复制代码



两个都不对,可以看到输出的最后一个是 99
也就是最后一次 *((int*)p1) 访问的是 99 100 101 102
明显数组越界访问
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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再来比较的,我的代码应该怎么优化啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

你的代码数组越界访问了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

1.png
2.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-9 20:42:16 | 显示全部楼层
jackz007 发表于 2020-1-8 16:38
编译、运行实况:

你也一样,数组越界访问

1.png
2.png

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
A小小鸟 + 5 + 5 + 3 辛苦姐姐了

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-9 21:14:48 | 显示全部楼层
本帖最后由 jackz007 于 2020-1-9 21:26 编辑
人造人 发表于 2020-1-9 20:42
你也一样,数组越界访问


        多谢提醒,疏忽了。
  1. #include <stdio.h>
  2. main(void)
  3. {
  4.         unsigned char data[] = {
  5.         0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x09,\
  6.         0x00,0x20,0x10,0x03,0x03,0x0C,0x00,0x00,0x44,0x00,\
  7.         0x00,0x33,0x00,0x47,0x0C,0x0E,0x00,0x0D,0x00,0x11,\
  8.         0x00,0x00,0x00,0x02,0x64,0x00,0x00,0x00,0xAA,0x00,\
  9.         0x00,0x00,0x64,0x10,0x00,0x00,0x00,0x00,0x00,0x00,\
  10.         0x00,0x00,0x02,0x00,0x74,0x0F,0x41,0x00,0x00,0x00,\
  11.         0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,\
  12.         0x00,0x02,0x74,0x0F,0x41,0x00,0x06,0x08,0x00,0x00,\
  13.         0x00,0x00,0x00,0x64,0x00,0x0F,0x00,0x00,0x0D,0x00,\
  14.         0x00,0x00,0x23,0x00,0x00,0x64,0x00,0x00,0x64,0x00 }                                                                                                                     ;
  15.         union {
  16.             unsigned char      b1                                                                                                                                               ;
  17.             unsigned short     b2                                                                                                                                               ;
  18.             unsigned int       b4                                                                                                                                               ;
  19.             unsigned long long b8                                                                                                                                               ;
  20.         } * p                                                                                                                                                                   ;
  21.         int d , k                                                                                                                                                               ;
  22.         for(k = 0 ; k < 100 ; k ++) if(data[k] == 100) printf(" Byte : [%d] = 100\n" , k)                                                                                       ;
  23.         for(d = 0 ; d < 2 ; d ++) for(k = d , p = (void *) & data[k] ; k + d + 2 < 100 ; k += 2 , p = (void *) & data[k]) if(p -> b2 == 100) printf(" Word : [%d] = 100\n" , k) ;
  24.         for(d = 0 ; d < 4 ; d ++) for(k = d , p = (void *) & data[k] ; k + d + 4 < 100 ; k += 4 , p = (void *) & data[k]) if(p -> b4 == 100) printf("DWord : [%d] = 100\n" , k) ;
  25.         for(d = 0 ; d < 8 ; d ++) for(k = d , p = (void *) & data[k] ; k + d + 8 < 100 ; k += 8 , p = (void *) & data[k]) if(p -> b8 == 100) printf("QWord : [%d] = 100\n" , k) ;
  26. }
复制代码

        编译、运行结果与前面完全相同
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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,再次四个字节比较,感觉有点遇到瓶颈了,本以为写的已经符合要求和逻辑了,没想到居然越界了,心慌慌啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-10 11:00:29 | 显示全部楼层
jackz007 发表于 2020-1-9 21:14
多谢提醒,疏忽了。

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

题目虽然没说,但是老师要求,只用指针,不能用其他特定的结构,对数组这样搜索,从第一个0x00开始 0x00,0x01,0x02,0x03四个字节比较,第二个从0x01开始,0x01,0x02,0x03,0x04,再次四个字节比较,而你用了共用体,不行的,抱歉了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-10 11:24:11 | 显示全部楼层
本帖最后由 jackz007 于 2020-1-10 11:25 编辑
A小小鸟 发表于 2020-1-10 11:00
题目虽然没说,但是老师要求,只用指针,不能用其他特定的结构,对数组这样搜索,从第一个0x00开始 0x00, ...


        只用指针也没什么难度:
  1. #include <stdio.h>
  2. main(void)
  3. {
  4.         unsigned char data[] = {
  5.         0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x09,\
  6.         0x00,0x20,0x10,0x03,0x03,0x0C,0x00,0x00,0x44,0x00,\
  7.         0x00,0x33,0x00,0x47,0x0C,0x0E,0x00,0x0D,0x00,0x11,\
  8.         0x00,0x00,0x00,0x02,0x64,0x00,0x00,0x00,0xAA,0x00,\
  9.         0x00,0x00,0x64,0x10,0x00,0x00,0x00,0x00,0x00,0x00,\
  10.         0x00,0x00,0x02,0x00,0x74,0x0F,0x41,0x00,0x00,0x00,\
  11.         0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,\
  12.         0x00,0x02,0x74,0x0F,0x41,0x00,0x06,0x08,0x00,0x00,\
  13.         0x00,0x00,0x00,0x64,0x00,0x0F,0x00,0x00,0x0D,0x00,\
  14.         0x00,0x00,0x23,0x00,0x00,0x64,0x00,0x00,0x64,0x00 }                                                                                                            ;
  15.         unsigned char      * p1                                                                                                                                        ;
  16.         unsigned short     * p2                                                                                                                                        ;
  17.         unsigned int       * p4                                                                                                                                        ;
  18.         unsigned long long * p8                                                                                                                                        ;
  19.         int d , k                                                                                                                                                      ;
  20.         for(k = 0 , p1 = & data[k] ; k < 100 ; k ++ , p1 ++) if(* p1 == 100) printf(" Byte : [%d] = 100\n" , k)                                                        ;
  21.         for(d = 0 ; d < 2 ; d ++) for(k = d , p2 = (unsigned short *) & data[k] ; k + 1 < 100 ; k += 2 , p2 ++) if(* p2 == 100) printf(" Word : [%d] = 100\n" , k)     ;
  22.         for(d = 0 ; d < 4 ; d ++) for(k = d , p4 = (unsigned int *) & data[k] ; k + 3 < 100 ; k += 4 , p4 ++) if(* p4 == 100) printf("DWord : [%d] = 100\n" , k)       ;
  23.         for(d = 0 ; d < 8 ; d ++) for(k = d , p8 = (unsigned long long *) & data[k] ; k + 7 < 100 ; k += 8 , p8 ++) if(* p8 == 100) printf("QWord : [%d] = 100\n" , k) ;
  24. }
复制代码

        编译、运行结果与前面完全相同
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-1 19:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表