我已宣布以下内容:
long long int *a[100000] //Global Declaration
动态声明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");
}
完成循环后,我的程序显示分段错误
由于我得到了一些测试用例的正确答案以及其他一些测试用例的分段错误,这意味着我没有访问非法内存。
我认为问题在于声明一个long long int
如此大的数组。
答案 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
的变化:
#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。