解决分段错误
问题描述:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main() {
int i,j;
int *u = malloc(10000 * 10000 * sizeof(int));
for (i=0; i<10000; i++)
{
for(j=0;j<10000;j++)
{
u[i][j]=i+j;
}
}
free(u);
}
我编辑了我的程序。当编译这个程序时,我得到一个错误“下标值既不是数组也不是指针也不是矢量”。 我该如何分配内存?解决分段错误
答
您已分配的内存为一维数组,你的记忆试图将其用作二维数组。还有,你需要做的,你的代码稍有改变:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
int i,j;
int *u = malloc(10 * 10 * sizeof(int));
for (i=0; i<10; i++)
{
for(j=0;j<10;j++)
{
u[10*i +j]=i+j; // this is how you can use it
}
}
for (i=0; i<10; i++)
{
for(j=0;j<10;j++)
{
printf("%d ",u[10 *i +j]);
}
printf("\n");
}
free(u);
return 0;
}
请注意,我已经使用了尺寸为10 * 10,你可以做任何你需要的大小相同。
答
您不能在声明中直接在堆上分配大型数组。 您可以分配使用malloc大数组如下
#include <stdlib.h> int *matrix = malloc(ROW * COLUMNs * sizeof(int));
始终使用列主要为了搜索元素。 说明列优先的顺序可以在这里找到Accessing elements in a matrix
这里的大小= 10000 你总是完成后你的任务,*
free(matrix);
[大数组大小分段故障]的可能的复制(http://*.com/questions/1847789/segmentation-fault-on-large-array-sizes) –
我认为标准堆Windows上的大小约为8MB,假设你使用的是32位系统,'double u [10000] [10000];'尝试分配大约48MB。 – George
我知道如何使用malloc分配内存数组,但我不知道如何分配内存的矩阵? – Armaa