#include<stdio.h>
int main(){
int * ptr=(int *)malloc(40);
printf("%d",sizeof(ptr));
}
当我è¿è¡Œæ—¶ï¼Œè¾“出结果为8 ......这里å‘生了什么...为什么输出8?
ç”案 0 :(得分:2)
sizeof
è¿ç®—符是一个编译时è¿ç®—符,任何指针的大å°éƒ½æ˜¯ä½ 机器上的8个å—节。
æ— æ³•æ£€ç´¢malloc
内å˜åŒºåŸŸçš„动æ€å¤§å°ã€‚ä½ å¿…é¡»çŸ¥é“它,或者把它ä¿å˜åœ¨æŸä¸ªåœ°æ–¹ã€‚
您å¯ä»¥è€ƒè™‘使用Boehm's conservative garbage collector,然åŽæ‹¨æ‰“GC_malloc
而ä¸æ˜¯malloc
ï¼Œæ‚¨æ— éœ€è‡´ç”µfree
(或GC_free
) ,您å¯ä»¥ä½¿ç”¨GC_size(p)
æ¥èŽ·å–以GC_malloc
开头的p
内å˜åŒºåŸŸçš„大致大å°ï¼ˆä½†æˆ‘ä¸å»ºè®®ä½¿ç”¨GC_size
)。< / p>
如果在Linux上使用malloc
,请了解如何使用valgrindæ¥æœå¯»å†…å˜æ³„æ¼é”™è¯¯ï¼Œå¹¶ä½¿ç”¨gcc -Wall -g
进行编译
ç”案 1 :(得分:2)
malloc()
返回一个指å‘40å—节内å˜ï¼ˆå¯èƒ½æ˜¯10个整数)的指针,并将其分é…ç»™ptr
。 sizeof(ptr)
为8çš„åŽŸå› æ˜¯å› ä¸ºæ‚¨ä½¿ç”¨çš„æ˜¯64ä½æœºå™¨ï¼ŒæŒ‡é’ˆçš„大å°ä¸º8个å—节。
ä½ åº”è¯¥åœ¨sizeof()
ä¸ä½¿ç”¨malloc()
å› ä¸ºå®ƒæ˜¯å¥½çš„å½¢å¼ï¼Œå¦‚果类型改å˜å¤§å°ï¼ˆè·¨è¶Šå¹³å°æˆ–其他),则é¿å…å‡ºçŽ°é—®é¢˜ã€‚å¦‚æžœä½ çœŸçš„æƒ³è¦10个整数的空间,那么使用:
int *ptr = malloc(10 * sizeof *ptr);
这会分é…10个大å°ç±»åž‹ä¸ºptr
的点,在本例ä¸ä¸ºint
ã€‚è¿™æ ·åšçš„好处是您å¯ä»¥åœ¨ä¸æ›´æ”¹malloc()
ç”案 2 :(得分:0)
å˜é‡ptr
是指å‘intçš„æŒ‡é’ˆï¼Œä½ çš„ç³»ç»Ÿç¢°å·§æœ‰8å—节的大å°ã€‚
ç”案 3 :(得分:0)
ptr是一个指针。打å°ç³»ç»Ÿä¸ŠæŒ‡é’ˆçš„大å°ã€‚ 当pträ¿å˜ä¸€ä¸ªåœ°å€æ—¶ï¼Œ8å—节是在64ä½æœºå™¨ä¸Šä¿å˜åœ°å€æ‰€éœ€çš„大å°ã€‚ è¿™æ˜¯ç‰¹å®šäºŽç¼–è¯‘å™¨çš„ã€‚æ‚¨æ— æ³•æ£€ç´¢åˆ†é…给指针的大å°ã€‚
å¦‚æžœä½ æœ‰è¿™ä¸ªç–‘é—®ï¼Œé‚£ä¹ˆä½ ä¹Ÿåº”è¯¥æ€€ç–‘free()如何在ä¸çŸ¥é“分é…给指针的大å°çš„情况下释放内å˜ã€‚
ç”案 4 :(得分:0)
我在我的Windows 32bit机器上å°è¯•äº†è¿™ä¸ªï¼Œæˆ‘得到了ans 4å—节,我认为ptr是一个指å‘int的指示,显示它显示相关