如果我使用mallocå’Œcalloc作为floatå˜é‡å¹¶å°†å…¶åˆ†é…ç»™int那么2个字节的其余部分会å‘生什么?

时间:2016-09-25 15:12:57

标签: c++ c malloc calloc

int x=(int)malloc(sizeof(float));

或

int y=(int)calloc(1,sizeof(double));

简而言之,如果我使用malloc()或calloc()è¦æ±‚更大的内存å—,但是将其分é…给较å°å†…存的å˜é‡ï¼Œé‚£ä¹ˆé¢å¤–内存会å‘生什么?

2 个答案:

答案 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)相åŒã€‚

总之,两个字节的剩余部分将是下一个整数,并且没有问题。

相关问题