创建大型2D阵列

时间:2015-04-09 12:54:37

标签: c arrays

我已宣布以下内容:

  1. long long int *a[100000] //Global Declaration

  2. 动态声明a[i]

    a[i]=(long long int*)calloc(sizeof(long long int),100000);
    
    for(i=0;i<100000;i++) {
       for(j=0;j<100000;j++)
           printf("%lld ",a[i][j]);
           printf("\n");
    }
    
  3. 完成循环后,我的程序显示分段错误

    由于我得到了一些测试用例的正确答案以及其他一些测试用例的分段错误,这意味着我没有访问非法内存。  我认为问题在于声明一个long long int如此大的数组。

3 个答案:

答案 0 :(得分:0)

注意2d数组的定义及其元素的分配:

#include <stdio.h>
#include <stdlib.h>
int main(void) {
    long long int* a[10][10]; //AS I MENTIONED IN THE COMMENT UNDER THE QUESTION
    int i, j;
    for(i=0;i<10;i++) {
       for(j=0;j<10;j++) {
           a[i][j] = calloc(sizeof(long long int),10);
       }
    }
    for(i=0;i<10;i++) {
       for(j=0;j<10;j++)
           printf("%lld ",a[i][j]);
           printf("\n");
    }
    return 0;
}

还要注意,根据您的版本,您将尝试分配100000x100000x100000字节的RAM(千万字节??)。

答案 1 :(得分:0)

假设您显示的第二个片段位于循环k = 0到100000-1内,您不希望在此循环中处理a的100000x100000个元素,因为显然只有100000 x {{1}到目前为止已经分配了元素。

这样做可以解决k所有a[i][j]的无效内存,并使用此方法调用未定义的行为。

将此限制打印修复为刚刚分配的列:

j > k

的变化:

  • 在C中投射#define ARRAY_SIZE (100000) ... long long int * a[ARRAY_SIZE] //Global Declaration for (size_z k = 0; k < ARRAY_SIZE; ++k) { a[k] = calloc(sizeof * a[k], ARRAY_SIZE); if (NULL == a[k]) { perror("calloc() failed); exit(1); } for (size_t j = 0; j < ARRAY_SIZE; ++j) { printf("%lld ", a[k][j]); } printf("\n"); } &amp;的结果朋友没有必要,也没有推荐。不要这样做。
  • 索引数组的首选类型是malloc()
  • 始终测试所有相关函数调用的结果。
  • 不要重复自己,不要使用魔法数字。因此,使用自解释size_t s或#define s。
  • 定义所有常量

答案 2 :(得分:-1)

为什么不像long long int a[100000][100000]那样初始化?太大了?

我担心这会让编译器感到困惑,因为a[i][j]是一种从二维数组中选择的方式。您是否尝试定义long long int *p

long long int *p
//... and in the loop
p=a[i];
printf("%lld",p[j]);

编辑:你有足够的ram + swap吗?对我来说,分配是80GB。