在c中声明一个未知大小的全局2D数组

时间:2018-01-12 18:23:16

标签: c arrays dynamic-memory-allocation

我想知道是否有可能在c中声明一个2D数组,即使我们不知道它的大小。我试着这样做

char **array;   //2D array of characters - global 
int length, height; // - global

然后在函数中声明像这样的大小

void size_and_data(){
int i;
//some more code here

array=(char**)malloc(sizeof(char*)*height);        //height and length are 
                                                   //given from a file
for(i=0;i<length; i++)
    array[i]= (char*)malloc(sizeof(char)*length);
//more code to follow..
}

此时此刻我的数组中充满了各种字符,我打印出每一个字符以确保它们存储得恰到好处。但是,如果我尝试在另一个功能中访问元素时,我会遇到分段错误。这就是我尝试访问它们的方式:

void access_f(){
    int i,j;
    for(i=0; i<height;i++){
        for (j=0;j<length; j++)
            printf("%c", array[i][j]);   
    }
}

请记住,两者之间不再涉及任何功能,因此阵列不会以任何方式发生变化。这应该发生吗?我认为全局变量保持其值,直到程序停止运行 我是c的新手,非常感谢任何帮助! 谢谢!

1 个答案:

答案 0 :(得分:0)

修正:

#include <stdio.h>
#include <stdlib.h>

char **arr;   //2D array of characters - global
int length = 4, height = 3; // - global

void access_f(){
    for(int i = 0; i < height; i++){
        for(int j = 0; j < length; j++){
            *(*(arr+i)+j) = 0; // Set data or whatever
            printf("%d ", *(*(arr+i)+j)); // Should produce an array of zeroes
        }
        printf("\n");
    }
}

int main(){
    arr = (char**)malloc(sizeof(char*) * height);

    for(int i = 0; i < height; i++) // Iterate over correct dimension
    arr[i]= (char*)malloc(length);

    access_f();
    return 0;
}

背景:

C语言确实有2D数组,但在声明时它们存储为连续的内存块:

int arr[3][2]; // -> int | int | int | int | int | int

他们的访问方式如下:

arr[2][1]; // Means index 2*cols + 1 = 2*2+1

手动分配2D数组,您必须分配两个数组: 首先是数据的连续数组(每列也可以是不同的数组)。然后指向数据列的指针数组。

int **arr; // arr[3][2]
// Will look like this: int* | int* | int*
// Where each points to data that is capitalized:
// INT | int | INT | int | INT | int