±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚcnblogs£¬Ö÷Òª´Óµ¥Ò»Ö°Ôð£¬ÃæÏò¶ÔÏó»úÖÆµÄʵÏÖ£¬½Ó¿Ú¸ôÀëµÈÈý¸ö·½Ãæ½éÉÜ¡£ |
|
µ¥Ò»Ö°Ôð
µ¥Ò»Ö°ÔðÔÔò£º
ͨ³£µÄ¶¨ÒåÊÇֻרעÓÚ×öÒ»¼þʺͽöÓÐÒ»¸öÒýÆðËü±ä»¯µÄÔÒò¡£¶ÔÓÚ½Ó¿Ú¡¢ÊµÏÖ¡¢º¯Êý¼¶±ðÍùÍùÎÒÃDZȽÏÈÝÒ×¹Ø×¢µ¥Ò»Ö°Ô𣬴ó¼Ò̸µÄÒ²±È½Ï¶à£¬µ«¶ÔÓÚ·µ»ØÖµ¡¢²ÎÊý¿ÉÄܲ»»áÓÐÌ«¶àµÄÈ˹Ø×¢¡£µ«ÍùÍù¾ÍÊÇÕâЩ²»·ûºÏµ¥Ò»Ö°ÔðÔÔòµÄÉè¼Æ¿ÉÄܵ¼ÖÂһЩºÜÄÑ·¢ÏÖµÄBUG¡£¿´¿´ÏÂÃæÕâ¶Î´úÂ룺
pBuf = (byte*)realloc(
pBuf, size);
if( pbBuf != NULL )
{
TODO...
} |
¿ÉÄܺܶàÈËÒ»ÑÛ¿´ÉÏÈ¥²¢Ã»ÓÐʲôÎÊÌ⣬ÏÈÈÃÎÒÃÇ¿´¿´Õâ¸ö¿âº¯ÊýµÄ¶¨Ò壺
º¯Êý¼ò½é
¡¡¡¡ÔÐÍ£ºextern void *realloc(void *mem_address, unsigned
int newsize);
¡¡¡¡Óï·¨£ºÖ¸ÕëÃû=£¨Êý¾ÝÀàÐÍ*£©realloc£¨Òª¸Ä±äÄÚ´æ´óСµÄÖ¸ÕëÃû£¬ÐµĴóС£©¡£
¡¡¡¡¹¦ÄÜ£ºÏÈÅжϵ±Ç°µÄÖ¸ÕëÊÇ·ñÓÐ×ã¹»µÄÁ¬Ðø¿Õ¼ä£¬Èç¹ûÓУ¬À©´ómem_addressÖ¸ÏòµÄµØÖ·£¬²¢ÇÒ½«mem_address·µ»Ø£¬Èç¹û¿Õ¼ä²»¹»£¬
ÏȰ´ÕÕnewsizeÖ¸¶¨µÄ´óС·ÖÅä¿Õ¼ä£¬½«ÔÓÐÊý¾Ý´ÓÍ·µ½Î²¿½±´µ½Ð·ÖÅäµÄÄÚ´æÇøÓò£¬¶øºóÊÍ·ÅÔÀ´mem_addressËùÖ¸ÄÚ´æÇøÓò£¬Í¬Ê±
·µ»ØÐ·ÖÅäµÄÄÚ´æÇøÓòµÄÊ×µØÖ·¡£¼´ÖØÐ·ÖÅä´æ´¢Æ÷¿éµÄµØÖ·¡£
¡¡¡¡·µ»ØÖµ£ºÈç¹ûÖØÐ·ÖÅä³É¹¦Ôò·µ»ØÖ¸Ïò±»·ÖÅäÄÚ´æµÄÖ¸Õ룬·ñÔò·µ»Ø¿ÕÖ¸ÕëNULL¡£ |
Õý³£Çé¿öÏÂpBufÊÇпռäµÄµØÖ·Ã»ÓÐÈκÎÎÊÌ⣬µ«ÎÒÃÇ¿¼ÂÇÏÂÈç¹û·ÖÅäʧ°ÜÁËÄØ£¬pBuf»á±»¸³Öµ³ÉNULL£¬pBufÔÖ¸ÏòµÄµØÖ·¿Õ¼ä¾ÍûÓÐÖ¸ÕëÖ¸ÏòÁË£¬Ôì³ÉÁËÄÚ´æÐ¹Â¶¡£ÕâÖÖÎÊÌâÍùÍùºÜÄѶ¨Î»¡£ÊìϤrealloc»úÖÆµÄÈË¿ÉÄܶÔÕâ¸öÎÊÌâºÜ²»Ð¼£¬ÈÏΪ¸ßÊÖ²»»á·¸ÕâЩ´íÎó¡£µ«ÎÒÃÇ¿ÉÒÔÏëÏÂÓÐûÓа취Éè¼ÆÒ»¸öºÃµÄ½Ó¿ÚÈòËÄñҲд³ö²»»á³ö´íµÄ´úÂëÄØ¡£¼ÙÉèÕâ¸ö¿âº¯ÊýµÄ½Ó¿ÚÊÇÕâÑùµÄÄØ£º
º¯Êý¼ò½é
¡¡¡¡ÔÐÍ£ºextern flag realloc(void **ppMem_address,
unsigned int newsize);
¡¡¡¡Óï·¨£º·µ»ØÖµ =£¨Êý¾ÝÀàÐÍ*£©realloc£¨Òª¸Ä±äÄÚ´æ´óСµÄÖ¸ÕëÃû£¬ÐµĴóС£©¡£
¡¡¡¡·µ»ØÖµ£ºÈç¹ûÖØÐ·ÖÅä³É¹¦Ôò·µ»ØÖ¸True£¨ppMem_address±£´æÐ·ÖÅä¿Õ¼äµØÖ·£©£¬·ñÔò·µ»ØFalse£¨ppMem_address±£´æÀÏ¿Õ¼äµØÖ·£©¡£ |
ÏàÐÅÈκÎÒ»¸öʹÓÃÕâ¸ö½Ó¿ÚµÄÈ˶¼»áд³öÏÂÃæµÄ´úÂ룺
if( True ==
realloc( &pBuf, size))
{
TODO...
}else
{
¡¡¡¡¡¡¡¡TODO...
} |
ΪʲôÓÐÈ˻᷸pBuf = (byte*)realloc( pBuf, size);ÕâÖÖ´íÎó£¿ÒòΪËûÖ»¹Ø×¢ÁËrealloc·µ»ØÖµÊÇÒ»¸öµØÖ·£¬Ã»ÓйØ×¢¸Ã·µ»ØÖµ»¹ÓдíÎóʶ±ðµÄ¹¦ÄÜ£¬»»¾ä»°À´ËµÕâ¸ö¿âº¯ÊýµÄ·µ»ØÖµ²»¾ß±¸µ¥Ò»Ö°Ô𣬵¼ÖÂÁË¿ÉÄܵĴíÎóʹÓá£Èç¹ûʹÓøĽøºóµÄ½Ó¿Ú£¬ÒòΪ·µ»ØÖµÖ»ÓÐÒ»¸öÅжϷÖÅä³É¹¦Óë·ñµÄ¹¦ÄÜ£¬ÏàÐÅûÓÐÈË»¹»áÓÃ´í¡£
ÎÒÃÇÔÙ×Ðϸ¿´¿´ÎÒÃÇеĽӿڣ¬×ܾõµÃËÆºõÓÐʲôµØ·½»¹ÊDz»¶Ô£¬¿´µ½void
**ppMem_address¿ÉÄÜÒªÏëÒ»ÏÂÃ÷°×£¬Õâ¸ö²ÎÊý¼ÈÊÇÈë²ÎÓÖÊdzö²Î£¬Ëü³Ðµ£ÁËÔʼµØÖ·µÄÊäÈëºÍеØÖ·µÄÊä³ö£¬Õâ²»ÓÖÎ¥·´Á˵¥Ò»Ö°ÔðÂ𣿺ðÉÎÒÃÇÔٸĽøÒ»Ï£º
º¯Êý¼ò½é
¡¡¡¡ÔÐÍ£ºextern flag realloc(void *pIn_Mem_address,void
**ppOut_Mem_address, unsigned int newsize);
¡¡¡¡Óï·¨£º·µ»ØÖµ =£¨Êý¾ÝÀàÐÍ*£©realloc£¨Òª¸Ä±äÄÚ´æ´óСµÄÖ¸ÕëÃû£¬ÐµÄÄÚ´æÖ¸ÕëÃû£¬ÐµĴóС£©¡£
¡¡¡¡·µ»ØÖµ£ºÈç¹ûÖØÐ·ÖÅä³É¹¦Ôò·µ»ØÖ¸True£¬·ñÔò·µ»ØFalse¡£ |
ÏÖÔÚÕâ¸ö½Ó¿Ú¾ÍËãÒ»¸ö³õ´Î¿´µ½µÄÈËÒ²Ó¦¸Ã´ó¸ÅÖªµÀʲôÒâ˼£¬ÏàÐÅÒ²²»»áд³öʲô´øBUGµÄ´úÂ룬ÒòΪº¯ÊýµÄ²ÎÊý¡¢·µ»ØÖµ¶¼¾ßÓе¥Ò»µÄ¹¦ÄÜ£¬Í¨¹ý·µ»ØÖµÀ´ÅжϷÖÅä³É¹¦Óë·ñ£¬Í¨¹ý³ö²ÎÀ´»ñÈ¡µØÖ·¡£Ò»Çп´ÆðÀ´¶¼ºÜÇåÎú¡£
ÔÚC¿âÖл¹ÓкܶàÀàËÆµÄº¯Êý£¬Èç¹ûµ±³õµÄÉè¼ÆÈËÔ±Äܶ࿼Âǵ¥Ò»Ö°Ôð£¬Ò²ÐíÏÖÔÚµÄϵͳÖоͻáÉÙÁ˺ܶàÒþ²ØµÄBUG£¬½Ó¿ÚÓÀÔ¶ÊǸø±ðÈËʹÓõģ¬Ò»¶¨Òª°ÑʹÓÃÕßµ±³Éɵ¹Ï£¬Ò²Ðí²ÅÄÜÉè¼Æ³öºÃµÄ½Ó¿Ú¡£
ÃæÏò¶ÔÏó»úÖÆµÄʵÏÖ
ΪʲôҪÓÃCÀ´Ä£ÄâÃæÏò¶ÔÏóµÄ»úÖÆ£¬ÔÚʵ¼ÊµÄ¹¤×÷ÖÐÎÒÃÇÍùÍùÔڸп®Ò»Ð©ÃæÏò¶ÔÏóµÄ¾µäÉè¼ÆÄ£Ê½ÓÉÓÚCÓïÑÔµÄÏÞÖÆÎÞ·¨Ê¹Óã¬Æäʵͨ¹ý¼òµ¥µÄÄ£ÄâÃæÏò¶ÔÏóµÄÐÐΪ£¬ÔÚCÓïÑÔÖÐÒ²¿ÉÒÔʹÓÃÕâЩģʽ¡£
1£ºÀàµÄ¹¹½¨
ÀàÃèÊöÁËËù´´½¨µÄ¶ÔÏó¹²Í¬µÄÊôÐԺͷ½·¨¡£ÎÒÃÇÔÚÒ»¸öÔ´ÎļþÖÐͨ¹ý°ÑÊý¾ÝºÍ²Ù×÷½øÐÐÊʵ±µÄ×éÖ¯À´Íê³ÉÀàµÄÄ£Äâ¡£
/*ÀàµÄÊý¾Ý*/
typedef struct SQUARE_S SQUARE_T;
struct SQUARE_S
{
void (*draw)(void*);
int sideLen;
};
/*ÀàµÄ·½·¨*/
static void draw(void* pObj)
{
SQUARE_T* pSqr = (SQUARE_T*)pObj;
printf("Draw Square len is %d\n",pSqr->sideLen);
} |
ÈçÉÏËùʾ£¬Ò»¸öÕý·½ÐεÄÀàÎÒÃÇÓÃÒ»¸ö½á¹¹ÌåSQUARE_TÀ´±íʾÕý·½ÐεÄÊôÐÔ£¬drawÊÇÆäÖеÄÒ»¸ö·½·¨¡£
2£ºÀàµÄ·â×°ÐÔ
ÀàµÄ·â×°Ò»°ãÒªÇó¶Ôϸ½ÚµÄÒþ²Ø²¢ÇÒÌṩָ¶¨µÄ·½·¨¹©µ÷ÓÃÕßʹÓã¬ÔÚSQUAREÕâ¸öÀàÖУ¬sideLenÊÇͼÐεÄϸ½Ú£¬Ö»ÐèÒªÌṩһ¸ödraw½Ó¿Ú¸øµ÷ÓÃÕß¡£Òò´ËÔÚÌṩ¸øÍⲿµ÷ÓõĽӿÚÍ·ÎļþÖй¹½¨ÈçϵĽӿڡ£
typedef struct
SHAPE_S SHAPE;
struct SHAPE_S
{
void (*draw)(void*);
}; |
ͨ¹ý¶¨Ò岻ͬµÄÊý¾Ý½á¹¹À´´ïµ½Êý¾ÝÒþ²ØµÄÄ¿µÄ£¬ÈçÏÂͼËùʾ£¬¶ÔÍâ½Ó¿ÚÖÐÖ»ÄÜ¿´µ½draw£¬ÄÚ²¿ÊµÏÖÖпÉÒÔ¿´µ½drawºÍsideLen¡£

3£º¶à̬µÄÄ£Äâ
¶à̬ÎÞÒÉÊÇÃæÏò¶ÔÏóÓïÑԵĺÜÖØÒªµÄÒ»¸ö»úÖÆ£¬ºÜ¶àÃæÏò¶ÔÏóµÄÉè¼ÆÄ£Ê½¶¼ÊÇÒÔ¶à̬Ϊ»ù´¡£¬CÓïÑÔ²¢²»Ö§³Ö¶à̬£¬µ¼ÖºܶàÉè¼ÆÄ£Ê½¶¼ÎÞ·¨Ö±½ÓʹÓá£
Ò»¸öµäÐ͵Ķà̬Àý×Ó£¬Í¨¹ýÉùÃ÷Ò»¸öSHAPE½Ó¿Ú£¬¸ù¾ÝʵÀý»¯¶ÔÏóÀàÐ͵IJ»Í¬£¬pShapeÔÚÔËÐÐʱ¶¯Ì¬µÄ±íÏÖ²»Í¬µÄÐÐΪ¡£
SHAPE* pShape
= NULL; //Ò»¸öÐÎ×´½Ó¿Ú
pShape = (SHAPE*)Ins(SQUARE,2); //ʵÀý»¯ÎªÒ»¸öÕý·½ÐÎ
pShape->draw(pShape); //pShape±íÏÖΪÕý·½ÐεÄÐÐΪ |
¶à̬»úÖÆµÄʵÏÖÒÀÀµº¯ÊýÖ¸Õ룬ÔÚÿ¸öÀàµÄ¹¹Ô캯ÊýÖаÑÏà¹Ø½Ó¿ÚÓþßÌåµÄº¯ÊýµØÖ·Ìî³ä£¬ÕâÑùÔÚʵÀý»¯Ò»¸ö¶ÔÏóµÄʱºòÎÒÃDzŰó¶¨ÁËÆä¾ßÌåµÄ²Ù×÷£¬Ò²¾ÍÊÇËùνµÄ¶¯Ì¬°ó¶¨¡£
/*ÿ¸öÀàµÄ¹¹Ô캯Êý*/
static void* Constructor(void* pObj,va_list* pData)
{
SQUARE_T* pSquare = (SQUARE_T*)pObj;
pSquare->draw = draw; //¾ßÌåÐÐΪµÄÌî³ä
pSquare->sideLen = va_arg(*pData,int);
return pObj;
} |
4£º¶ÔÏóµÄ´´½¨
ÓÐÁËÀ࣬ÎÒÃÇÐèҪʵÀý»¯Îª¿ÉÒÔÔËÐеĶÔÏó£¬ÊµÀý»¯Ö÷ÒªµÄ¹¤×÷ÊÇ·ÖÅäÄÚ´æ¡¢¶¯Ì¬°ó¶¨¡¢Êý¾Ý³õʼ»¯µÈ¹¤×÷¡£
void* Ins(const
void* pClass,...)
{
CLASS* pCls = NULL;
void* pObj = NULL;
va_list vaList = NULL;
pCls = (CLASS* )pClass;
pObj = malloc(pCls->classSize);
memset(pObj,0,pCls->classSize);
va_start(vaList,pClass);
pObj = pCls->Constructor(pObj,&vaList);
return pObj;
} |
½Ó¿Ú¸ôÀë
½Ó¿Ú¸ôÀ룺
¶¨ÒåΪ¿Í»§¶Ë²»Ó¦¸ÃÒÀÀµËü²»ÐèÓõĽӿڣ¬ÔÚCÓïÑÔÖÐÎÒÃÇ¿ÉÒÔ°ÑÍ·Îļþ¿´³ÉÒ»¸öÄ£¿éµÄ½Ó¿Ú£¬¸ù¾Ý½Ó¿Ú¸ôÀëÔÔòÒ²¾ÍÊÇ˵Õâ¸öÍ·ÎļþÖÐÖ»Äܰüº¬ÍⲿÐèÒªµÄ½Ó¿Ú£¬µ«ÔÚʵ¼ÊµÄÏîÄ¿ÖÐÍùÍùÍ·Îļþ¶¼²»·ûºÏ½Ó¿Ú¸ôÀëÔÔò¡£
1£ºÄÚ¡¢Íⲿ½Ó¿ÚµÄ¸ôÀ룺ͷÎļþÖÐͨ³£°üº¬ÁËÄ£¿éÄÚ²¿½Ó¿Ú£¨ÄÚ²¿ÀàÐͶ¨Òå¡¢ÄÚ²¿½Ó¿ÚÉùÃ÷£©ºÍÍⲿ½Ó¿Ú£¨Íⲿ½Ó¿ÚÉùÃ÷£©
¼ÙÉèmoudleÄ£¿é¶ÔÍâÌṩһ¸öfun1½Ó¿Ú£¬Ä£¿éÄÚ²¿ÊµÏÖÐèÒª¶¨ÒåÒ»¸ö½á¹¹ÀàÐÍ£¬Ò»°ãµÄʵÏÖÈçÏ£º
/*moudle.h*/
typedef struct str_s str_t;
struct str_s
{
int a;
int b;
};
void fun1(); |
/*moudle.c*/
#include "moudle.h"
void fun1()
{
str_t s = {0};
¡¡¡¡ TODO...
} |
¿Í»§¶ËÔÚʹÓýӿڵÄʱºòÐèÒª°üº¬moudle.hÎļþ£¬¶ø¸Ã½Ó¿Ú²¢²»·ûºÏ½Ó¿ÚµÄ¸ôÀ룬ÆäÄÚ²¿°üº¬Á˿ͻ§²¢²»ÐèÒªµÄһЩ¶¨Ò塣ΪÁ˽â¾öÕâ¸öÎÊÌâÎÒÃÇ¿ÉÒÔͨ¹ý¶¨Ò岻ͬµÄÍ·ÎļþÀ´¸ôÀë½Ó¿Ú£¬moudle.h¶¨ÒåÍⲿµÄ½Ó¿Ú£¬moudle.inc¶¨ÒåÄÚ²¿½Ó¿Ú
/*moudle.h*/
void fun1(); |
/*moudle.inc*/
typedef struct str_s str_t;
struct str_s
{
int a;
int b;
}; |
/*moudle.c*/
#include "moudle.inc"
void fun1()
{
str_t s = {0};
¡¡¡¡ TODO...
}; |
moudle.h°üº¬Íⲿģ¿éÐèÒªµÄ½Ó¿Ú£¬Íⲿģ¿é°üº¬moudle.h£¬moudle.inc°üº¬ÄÚ²¿Ä£¿éÐèÒªµÄ½Ó¿Ú£¬ÔÚÄ£¿éÄÚ²¿°üº¬moudle.inc¡£Í¨¹ý²é¿´Ä£¿éµÄ.incºÍ.hÎļþ£¬ÎÒÃǾͿÉÒÔÇåÎúµÄÀí½âÄ£¿é¶ÔÍâºÍ¶ÔÄÚÌṩÁËʲô½Ó¿Ú¡£
2£º±ÜÃâÍòÄÜÍ·ÎļþµÄʹÓã¬ÔÚʵ¼ÊÏîÄ¿ÖÐÎÒÃǾ³£¿ÉÒÔ¿´µ½Ò»Ð©Í·Îļþ°üº¬ÁËËùÓÐÄ£¿éµÄ½Ó¿ÚÉùÃ÷£¬¿Í»§¶ËÖ»ÐèÒª°üº¬Õâ¸öÍ·Îļþ¾Í¿ÉÒÔʹÓÃÈκνӿÚÁË¡£
/*global.h*/
#inlcude "moudle1.h"
#inlcude "moudle2.h"
#inlcude "moudle3.h"
....
#inlcude "moudlen.h" |
¿ÉÄÜ´øÀ´ÈçÏÂÎÊÌ⣺
»áÏÔÖøµÄÔö¼Ó±àÒëʱ¼ä£¬Èç¹ûÏîÄ¿´ó£¬¿ÉÄܴ󲿷ֵıàÒëʱ¼ä¶¼»¨ÔÚÕ¹¿ªÍ·Îļþ£¨±ÊÕßÒ»¸öÏîÄ¿²âÊÔ80%×óÓÒµÄʱ¼ä£©¡£
²»ÀûÓÚ´úÂëµÄ¿ò¼ÜµÄÀí½â£¬¿Í»§¶ËÎÞ·¨´Ó°üº¬µÄÍ·ÎļþÖÐÇåÎúµÄ¿´µ½ÒÀÀµÊ²Ã´Íⲿģ¿é¡£
3£ºÈç¹ûûÓиôÀë½Ó¿Ú¿ÉÄܻᵼÖÂһЩÎó²Ù×÷£º
Ò»¸öÊý¾Ý»ñȡģ¿éÌṩÁ½¸ö½Ó¿Ú·Ö±ð´ÓÍøÂçºÍ±¾µØ»º´æ»ñÈ¡Êý¾Ý£¬ºǫ́¹ÜÀíÄ£¿éʹÓÃÍøÂç½Ó¿Ú¶¨Ê±»ñÈ¡Êý¾Ý¸üлº´æ£¬Ç°Ì¨Ä£¿éʹÓûº´æ½Ó¿Ú¿ìËÙ»ñÈ¡Êý¾ÝÏÔʾ£¬ÓÉÓÚûÓжԽӿڸôÀ룬ºóÆÚµÄά»¤ÈËÔ±¿ÉÄܲ¢²»Çå³þ¿ªÊ¼µÄÉè¼Æ£¬ÔÚǰ̨ģ¿éÖÐÖ±½ÓʹÓÃÍøÂç½Ó¿ÚÀ´»ñÈ¡Êý¾ÝÏÔʾ£¬µ¼Ö½çÃæÑÓ³ÙÑÏÖØ¡£Èç¹ûÒ»¿ªÊ¼¾Í°Ñ½Ó¿Ú·ÖÀ룬¸øÇ°Ì¨Ä£¿éÌṩ±¾µØ»º´æ½Ó¿Ú£¬¸øºǫ́ģ¿éÌá¹©ÍøÂç½Ó¿Ú£¬¾Í²»»áµ¼ÖÂÎÊÌâµÄ³öÏÖ¡£
|