二维数组的动态内存分配

问题描述 投票:0回答:1

在此代码中,当我们为2D数组动态分配内存时,在4位地址之后为什么占用16个字节的间隙,但是当我们静态分配2D数组时,它没有这种间隙..这背后的原因???

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int r = 3, c = 4, i, j, count; 

    int stat[r][c];

    int *arr[r]; 
    for (i=0; i<r; i++) 
         arr[i] = (int *)malloc(c * sizeof(int)); 

    // Note that arr[i][j] is same as *(*(arr+i)+j) 
    count = 0; 
    for (i = 0; i <  r; i++) 
      for (j = 0; j < c; j++) 
         arr[i][j] = ++count; // Or *(*(arr+i)+j) = ++count 

    for (i = 0; i <  r; i++) 
      for (j = 0; j < c; j++) 
         printf("%d\n", *(arr+i)+j); 

    printf("\n\n");  
    for (i = 0; i <  r; i++) 
      for (j = 0; j < c; j++) 
         printf("%d\n", *(stat+i)+j); 

    /* Code for further processing and free the  
      dynamically allocated memory */

   return 0; 
} 

在此代码中,虽然我们为2D数组动态分配内存,但在4位地址之后为什么占用16个字节的间隙,但是当我们静态分配2D数组时,它就没有这样的...

c arrays pointers memory dynamic-memory-allocation
1个回答
0
投票

关于您问题的评论提供了最基本的建议-不用担心malloc将您的内存放在何处。无法保证会以任何顺序进行。它可能会为了进行各种优化或推测而定位分配,并且每次执行可能会有所不同。如果没有其他问题,则在您对malloc的调用之间进行其他内存分配,对空闲的垃圾回收的调用(即使用GC的语言)将影响下一个分配的位置。

© www.soinside.com 2019 - 2024. All rights reserved.