我想知道是否有可能在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的新手,非常感谢任何帮助! 谢谢!
答案 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