我需要创建一个二维数组。现在我把它创建为
int a[100][100]
但我需要使用C语言中的MALLOC动态分配内存。我用了代码
#include <stdio.h>
#include<stdlib.h>
int main(void)
{
int n=6,m=5,i,j;
int **a = malloc(n * sizeof(int *));
for(i = 0; i < m; i++)
a[i] = malloc(m * sizeof(int));
for( i = 1 ; i <= n ; i++ )
{
for( j = 1 ; j <= m ; j++ )
{
scanf("%d %d",&a[i][j]);
}
}
return 0;
}
但现在在将元素输入数组时,它显示了SEGMENTATION ERROR。
答案 0 :(得分:1)
你只需要
long *a = malloc(100*100*sizeof(long));
如果你想要一个大的内存块。
如果你想要一个long*
指针数组,然后每个数组都在一个单独的内存块中,就像这样:
long **a = malloc(100*sizeof(long*));
for (i=0; i<100; i++) {
a[i] = malloc(100*sizeof(long));
}
这创建了1个long*
指针数组,然后是每个指针的100个longs
的1个数组,但是我现在不确定你是否说a[10][15]
例如它是否会计算元素的位置,就好像它是一个连续的块。检查出。 :)
答案 1 :(得分:1)
您在评论中说n
是行数。因此,您需要分配n
行,每行m
。因此,第二个for
循环条件应为i < n
。此外,如果无法分配内存,则应检查malloc
的{{1}}的返回值。我建议进行以下更改 -
NULL
请注意,多维数组不是一种全新的类型。它只是一个元素数组,其中每个元素本身是一个数组(用于2D数组),一个数组数组(用于3D)数组,依此类推。如果您使用long long **a = malloc(n * sizeof(*a));
for(i = 0; i < n; i++)
a[i] = malloc(m * sizeof(*a[i]));
,则可以干净利落地将阵列分配为
C99
您还应该完成此操作 - How do I work with dynamic multi-dimensional arrays in C?
答案 2 :(得分:1)
您有三个错误:第一个是您只分配5
个辅助数组,但在输入中,您循环遍历6
个。
第二个问题是数组索引从零开始,即索引从零开始并且变为大小减1。
第三个问题是您扫描了两个数字(为什么?),但是只提供了一个指向scanf
的目标指针。
答案 3 :(得分:0)
如果你有C99使用可变长度数组
#include <stdio.h>
#include <stdlib.h>
int main(void) {
unsigned rows, cols;
printf("Enter rows and columns: ");
fflush(stdout);
scanf("%u%u", &rows, &cols);
int (*a)[cols]; // pointer to VLA
a = malloc(rows * cols * sizeof a[0][0]);
if (a) {
for (unsigned r = 0; r < rows; r++) {
for (unsigned c = 0; c < cols; c++) {
a[r][c] = r*c;
}
}
printf("the element at [4, 2] is %d\n", a[4][2]);
free(a);
}
return 0;
}
否则,您需要手动计算索引。
答案 4 :(得分:0)
您的代码中存在许多问题
首先,您需要long long a[100][100]
,但只为int
s
a[i] = malloc(m * sizeof(int));
您还访问了越界的数组。索引从0开始到array_length-1。
另一个问题是你扫描了2个int值,但只提供了1的地址。
scanf("%d %d",&a[i][j]);
你可以分配一个100个元素的指针数组,每个指向另一个100个元素数组的数组,但是这样做并不好,因为它需要花费一些时间来完成100个malloc
,并且最终的内存很可能不是不连续,这使得缓存不友好。还有一个小的内存开销,因为内存分配器必须将其四舍五入到最近的块大小,这很可能是2的幂,当你在第一维中分配越来越多的元素时,这可能很大。
您应该声明一个大小为100 * 100的一维数组。这将更快,并提高缓存一致性。要在a[i][j]
获取元素,只需执行a[i*WIDTH + j]
long long* a = malloc(WIDTH*HEIGHT*sizeof(long long));
for (i = 0; i < WIDTH*HEIGHT; i++)
{
scanf("%lld ",&a[i]);
}
for (i = 0; i < HEIGHT; i++)
{
for (j = 0; j < WIDTH; j++)
{
printf("%lld ", a[i*WIDTH + j]);
}
printf("\n");
}