鱼C论坛

 找回密码
 立即注册
查看: 3506|回复: 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-8 15:46:59 | 显示全部楼层
发代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-8 15:52:55 | 显示全部楼层
绝大多数软件都会进行字节对齐,32位环境,int应该是4字节对齐的,没有必要一个字节一个字节的找
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

即使arr是全局变量,编译器好像也不保证两次链接后地址一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[k] == 100) printf(" Byte : [%d] = 100\n" , k)                                                                               ;
        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) ;
        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) ;
        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) ;
}
        编译、运行实况:
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 : [34] = 100
 Byte : [42] = 100
 Byte : [83] = 100
 Byte : [95] = 100
 Byte : [98] = 100
 Word : [34] = 100
 Word : [98] = 100
 Word : [83] = 100
 Word : [95] = 100
DWord : [34] = 100

C:\Bin>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

使用道具 举报

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

我想知道,我的程序是哪里出问题了,我的1.jpj发错了,我其实发的是这个,你看看啊
1.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

代码函数部分全部拍下来了,没有缺失的了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

代码复制粘贴的那种
我不想看着图片抄一遍代码,我需要代码,需要调试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-9 13:50:27 From FishC Mobile | 显示全部楼层
学习下。。。
想知道小甲鱼最近在做啥?请访问 -> 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;
}

麻烦姐姐帮我看一下两种代码哪个是对的,谢谢啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-9 15:27:23 | 显示全部楼层
A小小鸟 发表于 2020-1-9 14:28
OK,不好意思啊,代码是下面两个
第一个
#include "stdafx.h"
#include <stdio.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++)
        {
                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
明显数组越界访问
想知道小甲鱼最近在做啥?请访问 -> 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再来比较的,我的代码应该怎么优化啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你的代码数组越界访问了
想知道小甲鱼最近在做啥?请访问 -> 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
想知道小甲鱼最近在做啥?请访问 -> 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 辛苦姐姐了

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[k] == 100) printf(" Byte : [%d] = 100\n" , k)                                                                                       ;
        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) ;
        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) ;
        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) ;
}
        编译、运行结果与前面完全相同
想知道小甲鱼最近在做啥?请访问 -> 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,再次四个字节比较,感觉有点遇到瓶颈了,本以为写的已经符合要求和逻辑了,没想到居然越界了,心慌慌啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

使用道具 举报

发表于 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] ; 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] ; 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] ; 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] ; k + 7 < 100 ; k += 8 , p8 ++) if(* p8 == 100) printf("QWord : [%d] = 100\n" , k) ;
}
        编译、运行结果与前面完全相同
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-5 07:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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