h****n 发帖数: 1093 | 1 给了一段代码,问是干什么的?
void foo(int *p1, int val1, int val2)
{
int *p2, *p3;
p2 = (int *)0x12fec8;
*p2 = val1;
p1 = (int *)*p2;
for (int i=1; i<10; i++)
{
p2 = (int *)0x12fec8;
*p2 = val1;
p3 = (int *)*p2;
val1+=sizeof(int);
*p3 = val2;
}
}
编译跑了一下也没看出这个代码是干啥的。求指教 |
j*****y 发帖数: 1071 | 2 感觉是给 一个 int[9] 的 array 里面的每个成员赋值为val2.
这个 array的 起始地址是 (int *)val1
【在 h****n 的大作中提到】 : 给了一段代码,问是干什么的? : void foo(int *p1, int val1, int val2) : { : int *p2, *p3; : p2 = (int *)0x12fec8; : *p2 = val1; : p1 = (int *)*p2; : for (int i=1; i<10; i++) : { : p2 = (int *)0x12fec8;
|
h****n 发帖数: 1093 | 3 我特意跑了一下程序
void foo(int *p1, int val1, int val2)
{
int j;
int *p2, *p3;
int * buf1 = (int*)malloc(sizeof(int)*20);
for(int j =0;j<20;j++)
buf1[j] = 1;
p2 = (int *)buf1;
//val1放到0x12fec8地址也就是当前p2指针指向的位置
*p2 = val1;
//把p1指向val1地址所指向的位置
p1 = (int *)*p2;
for (int i=1; i<10; i++)
{
p2 = (int *)buf1;
*p2 = val1;
p3 = (int *)*p2;
val1+=sizeof(int);
*p3 = val2;
}
printf("buf1:");
for(j =0;j<20;j++)
printf(" %d ",buf1[j]);
printf("\n");
}
int main()
{
int i = 1;
int j = 0;
int * buf2 = (int*)malloc(sizeof(int)*20);
for(j =0;j<20;j++)
buf2[j] = 2;
int * buf3 = (int*)malloc(sizeof(int)*20);
for(j =0;j<20;j++)
buf3[j] = 3;
foo(&i, (int)buf2, (int)buf3);
printf("buf2:");
for(j =0;j<20;j++)
printf(" %d ",buf2[j]);
printf("\n");
printf("buf3:");
for(j =0;j<20;j++)
printf(" %d ",buf3[j]);
printf("\n");
getchar();
return 0;
}
结果输出:
buf1: 4724008 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
buf2: 4724120 4724120 4724120 4724120 4724120 4724120 4724120 4724120
47
24120 2 2 2 2 2 2 2 2 2 2 2
buf3: 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
还是看不懂这个是干啥的。。请指教
【在 j*****y 的大作中提到】 : 感觉是给 一个 int[9] 的 array 里面的每个成员赋值为val2. : 这个 array的 起始地址是 (int *)val1
|
y********9 发帖数: 130 | 4
2L说的对啊 for里面做的就是pointer加法 地址每次增加一个int的量
【在 j*****y 的大作中提到】 : 感觉是给 一个 int[9] 的 array 里面的每个成员赋值为val2. : 这个 array的 起始地址是 (int *)val1
|
h****n 发帖数: 1093 | 5 明白了。。。多谢。。指针看得头晕,程序结果也验证了你的说法
【在 j*****y 的大作中提到】 : 感觉是给 一个 int[9] 的 array 里面的每个成员赋值为val2. : 这个 array的 起始地址是 (int *)val1
|
p*****2 发帖数: 21240 | |
U***5 发帖数: 2796 | 7 同疑惑中。
【在 p*****2 的大作中提到】 : 为什么程序敢用这个地址0x12fec8
|
j*****y 发帖数: 1071 | 8 有什么 特别的吗?
【在 p*****2 的大作中提到】 : 为什么程序敢用这个地址0x12fec8
|
U***5 发帖数: 2796 | 9 这样初始化出来的地址是在stack上还是在heap上?
感觉很二啊。
【在 j*****y 的大作中提到】 : 有什么 特别的吗?
|
p*****2 发帖数: 21240 | 10
不能随便指定内存地址吧。这个内存要是别人在用的怎么办?
【在 j*****y 的大作中提到】 : 有什么 特别的吗?
|
|
|
U***5 发帖数: 2796 | 11 vs2010上跑了跑,第6行立马access violation.
【在 p*****2 的大作中提到】 : : 不能随便指定内存地址吧。这个内存要是别人在用的怎么办?
|
p*****2 发帖数: 21240 | 12
感觉AV挺正常的。不是自己的memory。
【在 U***5 的大作中提到】 : vs2010上跑了跑,第6行立马access violation.
|
h****n 发帖数: 1093 | 13 最近在看嵌入式的面试题 嵌入式里面经常需要针对某个硬件地址作赋值所以这里就考
这个 不过这段代码故意写的乱来考察基本功
为什么程序敢用这个地址0x12fec8
★ Sent from iPhone App: iReader Mitbbs Lite 7.56
【在 p*****2 的大作中提到】 : 为什么程序敢用这个地址0x12fec8
|
b*****n 发帖数: 482 | 14 embedded system 和 lower level driver 什么的常常会用特定地址。不过通常要有个
global memmap 以确保没有地址冲突。就这段代码而言只是看指针操作清不清楚而已。 |
B*******1 发帖数: 2454 | 15 是的,很正常。
【在 b*****n 的大作中提到】 : embedded system 和 lower level driver 什么的常常会用特定地址。不过通常要有个 : global memmap 以确保没有地址冲突。就这段代码而言只是看指针操作清不清楚而已。
|
k***x 发帖数: 6799 | 16 就是从指定外设的寄存器读/写数据到内存
【在 h****n 的大作中提到】 : 最近在看嵌入式的面试题 嵌入式里面经常需要针对某个硬件地址作赋值所以这里就考 : 这个 不过这段代码故意写的乱来考察基本功 : : 为什么程序敢用这个地址0x12fec8 : ★ Sent from iPhone App: iReader Mitbbs Lite 7.56
|
b****g 发帖数: 192 | 17 函数一共三个参数
貌似是执行完就在地址0x12fec8那里存一个整数,值为val1。
又在地址为val1的地方连着整出来9个int那么,这9个地方存的都是整数val2.
但是我不懂为什么p1也是参数呢?
在函数内部,p1指向的是地址为val1的地方,这里存着第一个val2.
那函数执行完了,p1作为形参指向的地方就可能不是地址val1啦,
那位什么还要把p1作为函数参数呢?
函数里面p1从来就没出现在等号右边,
p1出现在等号左边就一次,也不带型号,所以也不能传值啊。
那这个p1就毫无用处,等于说函数执行完了,函数外的p1还无改变,*p1也无改变。
难道出现这个p1就是为了考考动不动指针?
【在 h****n 的大作中提到】 : 给了一段代码,问是干什么的? : void foo(int *p1, int val1, int val2) : { : int *p2, *p3; : p2 = (int *)0x12fec8; : *p2 = val1; : p1 = (int *)*p2; : for (int i=1; i<10; i++) : { : p2 = (int *)0x12fec8;
|
p*****2 发帖数: 21240 | 18 这样呀。上边几位大牛能谈谈embeded的职业前景吗? |
h****n 发帖数: 1093 | 19 感觉你说的对,p1完全没啥用处,出了函数p1的值不会被改变
0x12fec8地址存的是9个连续int的最后一个的地址
可能是用来便于下一次连续放9个val2的操作吧
这个题有个follow up说怎么精简代码,我瞎写了一个如下
void foo(int val1, int val2)
{
int step = sizeof(int);
for(int i=0;i<9;i++)
{
*((int *)val1) = val2;
val1 += step;
}
*((int *)0x12fec8) = val1 - step;
}
【在 b****g 的大作中提到】 : 函数一共三个参数 : 貌似是执行完就在地址0x12fec8那里存一个整数,值为val1。 : 又在地址为val1的地方连着整出来9个int那么,这9个地方存的都是整数val2. : 但是我不懂为什么p1也是参数呢? : 在函数内部,p1指向的是地址为val1的地方,这里存着第一个val2. : 那函数执行完了,p1作为形参指向的地方就可能不是地址val1啦, : 那位什么还要把p1作为函数参数呢? : 函数里面p1从来就没出现在等号右边, : p1出现在等号左边就一次,也不带型号,所以也不能传值啊。 : 那这个p1就毫无用处,等于说函数执行完了,函数外的p1还无改变,*p1也无改变。
|
n***e 发帖数: 723 | 20 感觉你原贴的代码是实际工作的时候凑出来的。如果没有那个p1,可能p2会直接被编译
器optimize掉。
仅仅是感觉。
【在 h****n 的大作中提到】 : 感觉你说的对,p1完全没啥用处,出了函数p1的值不会被改变 : 0x12fec8地址存的是9个连续int的最后一个的地址 : 可能是用来便于下一次连续放9个val2的操作吧 : 这个题有个follow up说怎么精简代码,我瞎写了一个如下 : void foo(int val1, int val2) : { : int step = sizeof(int); : for(int i=0;i<9;i++) : { : *((int *)val1) = val2;
|