我寫了一個小程序來檢查頁面對齊。 當程序本身硬編碼地址變量的值時,該程序工作正常,但是當我嘗試使用argc和argv值從命令行中取出它們時,輸出變得雜亂無章,uint64_t的值無法使用atoi函數從命令行恢復..?使用atoi函數從命令行輸入
正常的代碼,可以看到硬編碼到程序本身的地址的值。
1 #include<stdio.h>
2 #include<stdlib.h>
3
4 int aligned(uint64_t addr, uint64_t pgsize){
5 return ((uint64_t)addr % pgsize == 0);
6 }
7
8 int main(int argc, char*argv[]){
9 uint32_t i;
10 uint64_t addr, size;
11 addr=0x1900000000;
12 size=0x100000000 ;
13
14 for(i=0;i<7;i++)
15 if(aligned(addr,size>>i)){
16 printf("Aligned to %#lx\n",size>>i);
17 }
18 else
19 printf("Not Aligned to %#lx\n",size>>i);
20 return 0;
21 }
輸出
[souravhimanshu] ./aligned
Aligned to 0
Aligned to 0x80000000
Aligned to 0x40000000
Aligned to 0x20000000
Aligned to 0x10000000
Aligned to 0x8000000
Aligned to 0x4000000
時的atoi後印有命令行輸入
1 #include<stdio.h>
2 #include<stdlib.h>
3
4 int aligned(uint64_t addr, uint64_t pgsize){
5 return ((uint64_t)addr % pgsize == 0);
6 }
7
8 int main(int argc, char*argv[]){
9 uint32_t i;
10 uint64_t addr, size;
11 if(argc<2){
12 printf("usage ./chkalign <address>\n");
13 exit(-1);
14 }
15 addr=atoi(argv[1]);
16 printf("%#lx",addr);
17 //addr=0x1900000000;
18 size=0x100000000 ;
19
20 for(i=0;i<7;i++)
21 if(aligned(addr,size>>i)){
22 printf("Aligned to %#lx\n",size>>i);
23 }
24 else
25 printf("Not Aligned to %#lx\n",size>>i);
26 return 0;
27 }
輸出(不正確的)
[[email protected]] ./chkalign 0x924000000
0Aligned to 0
Aligned to 0x80000000
Aligned to 0x40000000
Aligned to 0x20000000
Aligned to 0x10000000
Aligned to 0x8000000
Aligned to 0x4000000
我們可以看到addr的值代碼功能顯示爲0.
請告知...
你嘗試'與strtol()'呢? – 2015-04-01 06:42:29
請勿包含行號,否則我們無法輕鬆地將您的代碼複製/粘貼到文本編輯器中並進行編譯。 – Lundin 2015-04-01 06:53:57
當你問到這裏的時候,真的把你的代碼編寫成一個簡單的例子。你的問題與解釋地址等無關。正如你在標題中正確的,你有一個'atoi'的問題,所以解決這個問題,並省略所有無趣的東西。 – 2015-04-01 07:21:01