為什么要用指定的內(nèi)存地址執(zhí)行程序。
成都創(chuàng)新互聯(lián)公司主要從事成都做網(wǎng)站、成都網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)阜寧,10年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18982081108
當(dāng)然,c語言被編譯連接后肯定都是一條一條的指令。也肯定是存在內(nèi)存中的。
那么如果你是想跳到其他的程序的指令。那么你的需求是有用的。
可是,很不幸。這樣的話,操作系統(tǒng)是不允許的,會報異常的。屬于內(nèi)存越界錯誤,很明顯你創(chuàng)建的程序是無法訪問其他程序的指令的。
其次,如果你只是想跳到本身的c語言的某條指令的話。使用goto語句就可以實(shí)現(xiàn)。雖然是不鼓勵的。其次,規(guī)范好你的算法實(shí)現(xiàn)。用循環(huán)和判斷完全能夠?qū)崿F(xiàn)。如果那條指令是匯編編寫的程序的話。你也可以在c中嵌套匯編語言,jump到該指令。如果是匯編有關(guān)的話,跳轉(zhuǎn)指令應(yīng)該經(jīng)常會用的吧。
你需要的這個函數(shù),C語言本來就有:memcpy
void *memcpy(void *dest, const void *src, size_t n);
函數(shù)的功能是從源src所指的內(nèi)存地址的起始位置開始拷貝n個字節(jié)到目標(biāo)dest所指的內(nèi)存地址的起始位置中。
舉個例子:將s中的字符串復(fù)制到字符數(shù)組d中。
#includestdio.h?
#includestring.h?
int?main()?
{?
char*s="GoldenGlobalView";?
chard[20];?
memcpy(d,s,(strlen(s)+1));?
printf("%s",d);?
getchar();?
return0;?
}
#include stdio.h
void f()
{
}
void main()
{
printf("%u\n", f);
printf("%u\n", f);
printf("%p\n", f);
}
主函數(shù)中前兩行%u表示輸出無符號的十進(jìn)制,而第三行%p表示輸出地址,其結(jié)果是一個十六進(jìn)制的數(shù),你將其轉(zhuǎn)換成十進(jìn)制,你會發(fā)現(xiàn)與前兩行結(jié)果一樣。
這太簡單了, 函數(shù)指針就搞定.
但是一定要確定函數(shù)的返回值與參數(shù).
比如說有一個函數(shù)定義: int func(int i);
則就要這樣:
int (*p)(int i);
scanf("%p", p);
p(10);
據(jù)我所知,創(chuàng)建數(shù)組需要2個參數(shù),1是地址,2是分配空間??臻g分配是不能重復(fù)的,也就是說創(chuàng)建2個數(shù)組,這兩個數(shù)組是不可能重合的,為了防止這種事情出現(xiàn),所以不能指定地址。而是編譯器自動分配,不能人為。
但是可以省去分配空間這個步驟,而是只創(chuàng)建地址,這就是指針的概念。比如int a[12],你若是想創(chuàng)建另一個代替a[12],可以int *p=a;這樣,p的值就是a數(shù)組的首地址了。int *p =(int*)0x80000;意思就是p[0]的地址是0x80000,創(chuàng)建的時候要確定(int*)0x80000已經(jīng)分配過了,可以使用了,不然就相當(dāng)于野指針,容易出錯。