#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*是8个字节
2. 因为打印16进制习惯了 %08X 这种输出方式,所以必须注意一下
,linux下输出64bit的方式是 %016llX 0:位数补全,16:输出16个数到终端, llX:64bit的输出方式