int x=(int)malloc(sizeof(float));
或
int y=(int)calloc(1,sizeof(double));
简而言之,如果我使用malloc()
或calloc()
è¦æ±‚更大的内å˜å—,但是将其分é…给较å°å†…å˜çš„å˜é‡ï¼Œé‚£ä¹ˆé¢å¤–内å˜ä¼šå‘生什么?
ç”案 0 :(得分:3)
首先,malloc()
和系列会返回指å‘void
(void *
)的指针,我们将其å˜å‚¨åˆ°â€œæŒ‡å‘类型指针â€ç„¶åŽä½¿ç”¨è¯¥æŒ‡é’ˆå°†â€œtypeâ€çš„值å˜å‚¨åˆ°å†…å˜ä½ç½®ã€‚
对于对malloc()
å’Œfamily的调用,我们以å—节为å•ä½ä¼ 递所需的大å°ï¼Œå¦‚æžœæˆåŠŸï¼Œå®ƒä»¬è¿”回指å‘所请求的内å˜åŒºåŸŸçš„指针(以å—节为å•ä½ï¼‰ã€‚å› æ¤ï¼Œåªè¦x
,y
å’Œz
评估为相åŒï¼Œ
int * p = malloc(x);
,或者
int * p = malloc(y);
或
int * p = malloc(z);
将返回相åŒæ•°é‡çš„内å˜ã€‚
现在,如果它å‘生在您的平å°sizeof(int) == sizeof(float) == 4
上,那么,我们å¯ä»¥å†™
int * p = malloc(sizeof(int));
,或者
int * q = malloc(sizeof(float));
或
int * r = malloc(4);
他们都将返回相åŒæ•°é‡çš„内å˜ã€‚
 Â注æ„:以上陈述仅供å‚考,使用
malloc()
的最佳方å¼æ˜¯ä½¿ç”¨è¡¨å•<someType> * var = malloc(sizeof(*var));
FWIW,(就åƒä½ 在代ç ä¸æ‰€åšçš„é‚£æ ·ï¼‰æŒ‡å®šä¸€ä¸ªæ•´æ•°ç±»åž‹çš„æŒ‡é’ˆæ˜¯å®žçŽ°å®šä¹‰çš„è¡Œä¸ºã€‚ä¸€èˆ¬æ¥è¯´ï¼Œä¸è¦è¿™æ ·åšã€‚
é‚£å°±æ˜¯è¯´ï¼Œä½ æ€»æ˜¯å¯ä»¥è‡ªç”±åœ°åˆ†é…æ¯”ä½ éœ€è¦çš„更多的内å˜ï¼Œä»ŽC的角度æ¥çœ‹ï¼Œåªè¦ä½ free()
就没有问题。例如,您å¯ä»¥ä¸º10个整数分é…空间,而最终åªä½¿ç”¨å…¶ä¸çš„5个。那里没有技术问题。
ç”案 1 :(得分:0)
如果我们有以下代ç è¡Œ
int *x=(int*)malloc(sizeof(float));
这里malloc返回一个指针,然åŽå°†å…¶æŒ‡å®šä¸ºæ•´æ•°ç±»åž‹çš„指针
å‡è®¾float的大å°ä¸º4个å—节,int为2个å—èŠ‚ã€‚çŽ°åœ¨ä¼ é€’ç»™malloc
çš„å‚æ•°åªæ˜¯æ‚¨æƒ³è¦åˆ†é…çš„å—节数。这里sizeof(float)
返回4å’Œ4个å—节,malloc返回指å‘分é…的第一个å—节的指针。所以在这ç§æƒ…况下,分é…了两个整数空间,这是连ç»åˆ†é…ã€‚å› æ¤ï¼Œç¬¬ä¸€ä¸ªint和接下æ¥çš„2个å—节的å‰ä¸¤ä¸ªå—节是下一个整数,它å˜æˆä¸€ä¸ªæ•°ç»„。
我们å¯ä»¥å°†å…¶ä½œä¸º
访问 Âx [0]与*(x + 0)和x [1]相åŒï¼Œä¸Ž*(x + 1)相åŒã€‚
总之,两个å—节的剩余部分将是下一个整数,并且没有问题。