7

我正在处理一项任务(另一个问题中的详细信息)。作为其中的一部分,我正在增加数组的大小。并发现当我尝试初始化一个数组时:

int arr[2097152]; // 8MB

我遇到了分段错误...我认为是因为我试图声明一个太大的数组?然后我发现解决这个问题的方法是使用malloc. 但是对 C 来说是新手(主要使用 JavaScript/Python/Java ...)。我对指针和东西感到非常困惑......

我已经声明了一个 8MB 的数组:

int *arr = malloc (MBs * 1024 * 1024 / sizeof(int)); // MBs = 8

但是现在......我如何访问它或写入它?当我使用它arr时,我是否获得了地址,如果我使用它,*arr我会获得第一个元素?

4

5 回答 5

10

像 一样使用它arr[index],就像它被声明为一个数组一样。在 C 中,符号x[y]完全等价于*(x + y). 这适用于数组,因为数组名称被转换为指向其第一个元素的指针。

int *arr = malloc (MBs * 1024 * 1024 / sizeof(int));

这不是一个好方法(并且不会使其达到您想要的大小),因为您手边没有元素的数量。您应该根据元素的数量声明它,例如,

#define ARR_LENGTH 2097152
int *arr = malloc (ARR_LENGTH * sizeof *arr);

您需要乘以元素大小,因为 malloc 的参数是字节数。

于 2012-09-26T09:37:43.937 回答
5

我认为是因为我试图声明一个太大的数组?

确实是的。您很可能在函数中执行此操作。其中阵列是在堆栈上的本地存储上创建的,通常堆栈不会大到足以满足这种大尺寸的需求。
通常的解决方案是使用动态内存。

我如何访问它或写入它?当我像arr获取地址一样使用它时,如果我使用它,*arr我会得到第一个元素?

您可以通过使用运算符以与使用数组类似的方式访问它[]

注意,

arr[i] == i[arr] == *(arr + i) == *(i + arr)

所以,

arr[0] ---> Gives you first element
arr[1] ---> Gives you Second element
and so on...

请注意,数组的名称有时会衰减为指向其第一个元素的指针,但数组和指针并不相同!

好读:

如何在 C++ 中使用数组?

于 2012-09-26T09:38:01.417 回答
3

是的,您可以像使用ARRAY一样使用它。

int *arr = malloc (MBs * 1024 * 1024) ;
arr[0] = 1 ;
arr[6] = 675 ;
etc. ;

* arr = arr[0] ; \第一个元素

于 2012-09-26T09:44:02.823 回答
2

该符号a[i]等同于*(a + i)(因此也等同于i[a],因为加法是可交换的)。由于指针算法和数组到指针的衰减,您可以对数组和指针到数组元素使用此语法:

int a[10];
int * b = a + 4;
int * c = malloc(sizeof(int) * 100);

a[2];   // third element of a
b[1];   // sixth element of a
c[3];   // fourth element of the array starting at c

free(c);  // don't forget to clean up!

至于您的第一个问题:自动变量的可用空间确实有限。溢出这个空间被称为......堆栈溢出。

于 2012-09-26T09:41:34.473 回答
2

您还可以尝试将大数组作为静态变量放在堆栈区域之外。可能你不会再有段错误了。

于 2012-09-26T11:04:07.153 回答