Linux下程式設計注意---32位系統移植到64位系統
阿新 • • 發佈:2018-11-20
#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> #include <malloc.h> pthread_t thread_id[2]; unsigned int c; void *thrd_func(void *arg) { char* p = (char*)malloc(1024); c = (unsigned int)p; printf("[%08X][%08X]\n", p, c); sleep(5); printf("%d\n", p[0]); } void *thrd_func1(void *arg) { sleep(2); char* p; p = (char*)c; printf("[%8X][%08X]\n", p, c); p[0] = 4; } int main(void) { int i; if(pthread_create(&thread_id[0],NULL,thrd_func,NULL)!=0) { printf("Create thread error!\r\n"); exit(1); } if(pthread_create(&thread_id[1],NULL,thrd_func1,NULL)!=0) { printf("Create thread error!\r\n"); exit(1); } for(i = 0; i < 2; i++){ pthread_join(thread_id[i], NULL); } }
這個程式碼執行會出現段錯誤,找了一個晚上,最後發現有幾個知識點沒把握住
1.執行環境是64bit系統,所以int型是4個bytes(int型在任何位數系統中都是4個位元組,而指標跟cpu位數有關), char*是78個位元組
2. 因為列印16進位制習慣了 %08X 這種輸出方式,所以必須注意一下
,linux下輸出64bit的方式是 %016llX 0:位數補全,16:輸出16個數到終端, llX:64bit的輸出方式