相关疑难解决方法(0)

如何在C中正确设置,访问和释放多维数组?

关于C中的多维数组,我已经看过几十个关于"我的代码有什么问题"的问题.出于某种原因,人们似乎无法理解这里发生的事情,所以我决定回答这个问题作为对其他人的参考:

如何在C中正确设置,访问和释放多维数组?

如果其他人有有用的建议,请随时发布!

c malloc dynamic multidimensional-array

24
推荐指数
3
解决办法
5435
查看次数

静态数组与动态数组的C/C++性能

当性能对应用程序至关重要时,应该考虑是否在堆栈上声明一个数组而不是堆?请允许我概述为什么会出现这个问题.

由于C/C++中的数组不是对象并且衰减为指针,因此编译器使用提供的索引来执行指针算法来访问元素.我的理解是,当经过第一个维度时,此过程静态声明的数组不同,是动态声明的数组.

如果我要在堆栈上声明一个数组,如下所示;

  int array[2][3] = { 0, 1, 2, 3, 4, 5 }
  //In memory        { row1 } { row2 }
Run Code Online (Sandbox Code Playgroud)

该数组将以行主格式存储在内存中,因为它存储在连续的内存块中.这意味着当我尝试访问数组中的元素时,编译器必须执行一些加法和乘法才能确定正确的位置.

所以如果我要做以下事情

  int x = array[1][2]; // x = 5
Run Code Online (Sandbox Code Playgroud)

然后编译器将使用以下公式:

i =行索引j =列索引n =单行的大小(此处n = 2)
array =指向第一个元素的指针

  *(array + (i*n) + j)
  *(array + (1*2) + 2)  
Run Code Online (Sandbox Code Playgroud)

这意味着如果我循环遍历此数组以访问其每个元素,则通过索引对每个访问执行额外的乘法步骤.

现在,在堆上声明的数组中,范例是不同的,需要一个多阶段解决方案.注意:我也可以在这里使用C++ new运算符,但我相信数据的表示方式没有区别.

  int ** array;
  int rowSize = 2;
  // Create a 2 by 3 2d array on the heap
  array = malloc(2 * …
Run Code Online (Sandbox Code Playgroud)

c c++ memory performance data-structures

18
推荐指数
1
解决办法
2万
查看次数

差异b/w在1行或逐行中将内存分配给2D阵列

在这两种情况下,访问数组或内存分配会产生什么影响:

1.

    int **arr;
    arr = malloc( sizeof(int) * row * column );
Run Code Online (Sandbox Code Playgroud)

2.

    int **arr;
    arr = malloc( sizeof(*arr) * row);
    for(i=0; i<row; i++)
        arr[i] = malloc( sizeof( **arr) * column));
Run Code Online (Sandbox Code Playgroud)

c malloc multidimensional-array

5
推荐指数
1
解决办法
1793
查看次数

动态分配数组解释

这是我的老师向我们展示的示例代码"如何在C中动态分配数组?".但我不完全理解这一点.这是代码:

int k;
int** test;
printf("Enter a value for k: ");
scanf("%d", &k);
test = (int **)malloc(k * sizeof(int*));
for (i = 0; i < k; i++) {
    test[i] = (int*)malloc(k * sizeof(int)); //Initialize all the values
}
Run Code Online (Sandbox Code Playgroud)

我想在C中,定义一个你必须把它放在[]名字后面的数组,那究竟是什么int** test; 它不仅仅是一个指针指针吗?这malloc()条线也让我很困惑.....

c arrays pointers dynamic-arrays

4
推荐指数
1
解决办法
5068
查看次数