linux 64位系统的指针为8字节

来源:互联网 发布:剑侠情缘2白金版 mac 编辑:程序博客网 时间:2024/05/29 16:03
//DeclareFunTest.c#include "LoadBuffer.h"int main(){int i;UserBuffer *buf;buf=LoadBuffer();printf("in main,%%p=%p,%%x=%x\n",buf,buf);printf("size of int=%d\nsize of pointer=%d\n",sizeof(i),sizeof(buf));long count=0;for(i=0;i<buf->size;++i){buf->buffer[i]=i+1;count += buf->buffer[i];}printf("count=%d\n",count);return 0;}

// LoadBuffer.c#include"LoadBuffer.h"UserBuffer* LoadBuffer(){UserBuffer *ptr;ptr=calloc(sizeof(UserBuffer),1);ptr->size=BUFFER_SIZE;printf("in LoadBuffer,%%p=%p,%%x=%x\n",ptr,ptr);return ptr;}


// LoadBuffer.h#include<stdio.h>#include<stdlib.h>#ifndef _LOAD_BUFFER_H_#define _LOAD_BUFFER_H_#define BUFFER_SIZE 102400typedef struct{int size;int buffer[BUFFER_SIZE];}UserBuffer;//注释函数定义,则在调用时,程序默认返回int//UserBuffer * LoadBuffer();#endif
#makefileDeclareFunTest: DeclareFunTest.c LoadBuffer.c LoadBuffer.hgcc DeclareFunTest.c LoadBuffer.c  -o DeclareFunTest -g -fPICrun:./DeclareFunTestdebug:gdb DeclareFunTest -x DeclareFunTest.cmdclean:rm -rf libLoadBuffer.so DeclareFunTest

#DeclareFunTest.cmdbreak LoadBuffer.c:7commandsprintf "in LoadBuffer,ptr=%lx\n",ptrcontinueendbreak DeclareFunTest.c:8commandsprintf "in main,buf=%lx\n",bufcontinueendr

注释掉LoadBuffer.h 中的函数原型定义,则在main函数中,gcc在编译时认为LoadBuffer函数返回int类型,而不是指针类型。

而在64为系统中,int占4个字节,而指针占8字节,导致数据截断,从而导致程序访问错误的内存空间。

0 0
原创粉丝点击