求解连个程序哪个对那个错啊??
本帖最后由 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
我写了两个程序,但是结果输出却不一样,不知道哪个对那个错啊?错在哪里了?求大神能指点一下,谢谢了
发代码 绝大多数软件都会进行字节对齐,32位环境,int应该是4字节对齐的,没有必要一个字节一个字节的找
我大概看了一下
两个程序应该都是对的
输出结果不同是因为输出的地址是相对于整个程序的地址,而不是相对于arr的地址
即使arr是全局变量,编译器好像也不保证两次链接后地址一样
#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:09 编辑
人造人 发表于 2020-1-8 16:02
我大概看了一下
两个程序应该都是对的
输出结果不同是因为输出的地址是相对于整个程序的地址,而不是相对 ...
这道题就是直接在定义的数组里面去找,上面的1.jpj发错了,我其实发的是这个,求姐姐看一下,为什么同一个数组,同一个编译器,却找出来两个地址,这应该是不可能的吧 jackz007 发表于 2020-1-8 16:38
编译、运行实况:
我想知道,我的程序是哪里出问题了,我的1.jpj发错了,我其实发的是这个,你看看啊{:5_91:} 人造人 发表于 2020-1-8 15:46
发代码
代码函数部分全部拍下来了,没有缺失的了{:5_91:} A小小鸟 发表于 2020-1-9 11:12
代码函数部分全部拍下来了,没有缺失的了
代码复制粘贴的那种
我不想看着图片抄一遍代码,我需要代码,需要调试
学习下。。。 人造人 发表于 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;
}
麻烦姐姐帮我看一下两种代码哪个是对的,谢谢啦 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
明显数组越界访问
人造人 发表于 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:} A小小鸟 发表于 2020-1-9 19:49
可是我的指针只加了100次,我代码意思是int类型的100,因为数组是char型的,所以,要四个字节来比较 ,但 ...
你的代码数组越界访问了
A小小鸟 发表于 2020-1-9 19:49
可是我的指针只加了100次,我代码意思是int类型的100,因为数组是char型的,所以,要四个字节来比较 ,但 ...
看到没有,搜索结果竟然取决于全局变量a的值,a为0时搜索结果是2个,a为1时搜索结果是1个,都说你数组越界访问了
jackz007 发表于 2020-1-8 16:38
编译、运行实况:
你也一样,数组越界访问
本帖最后由 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) ;
}
编译、运行结果与前面完全相同 人造人 发表于 2020-1-9 20:29
看到没有,搜索结果竟然取决于全局变量a的值,a为0时搜索结果是2个,a为1时搜索结果是1个,都说你数组越 ...
哇,真是这样,求姐姐,告诉一下,我的代码应该怎么样改,能满足那种搜搜需要,就是对数组这样搜索,从第一个0x00开始 0x00,0x01,0x02,0x03四个字节比较,第二个从0x01开始,0x01,0x02,0x03,0x04,再次四个字节比较,感觉有点遇到瓶颈了,本以为写的已经符合要求和逻辑了,没想到居然越界了,心慌慌啊{:10_266:} jackz007 发表于 2020-1-9 21:14
多谢提醒,疏忽了。
编译、运行结果与前面完全相同
题目虽然没说,但是老师要求,只用指针,不能用其他特定的结构,对数组这样搜索,从第一个0x00开始 0x00,0x01,0x02,0x03四个字节比较,第二个从0x01开始,0x01,0x02,0x03,0x04,再次四个字节比较,而你用了共用体,不行的,抱歉了{:10_266:} 本帖最后由 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