在运行时初始化一个全局的二维C数组

时间:2012-01-29 16:46:09

标签: c pointers

我需要存储一个点(x,y)数组。我从文件中读取了点,并且点数不是常数,但我可以在文件的第一行得到它。所以我编写一个过程load()来加载文件中的点并将它们存储在一个全局数组中。它不起作用。 我的代码:

int *array[][]; // this is a pointer to a 2-dimensional array??

void load(){
..
int tempArray[2][n];  //n is the first line of the file
..
array = tempArray;
}

4 个答案:

答案 0 :(得分:3)

您正在尝试返回指向定义变量的函数的本地内存的指针。一旦该函数停止运行(“超出范围”),该内存将被重新用于其他内容,因此稍后尝试引用它是非法的。

您应该查看动态分配,并让加载函数分配所需的内存并将其返回。

函数原型可以是:

int * read_points(const char *filename, size_t *num_points);

其中filename当然是要打开的文件的名称,num_points设置为找到的点数,返回的值是指向包含x和y值的数组的指针,交错。所以这将打印加载的第一个点的坐标:

size_t num_points;
int    *points;

if((points = load_points("my_points.txt", &num_points)) != NULL)
{
  if(num_points > 0)
    printf("the first point is (%d,%d)\n", points[0], points[1]);
  free(points);
}

答案 1 :(得分:2)

您的此声明不起作用:

int *array[][]; // this is a pointer to a 2-dimensional array??

首先,它试图声明int *的2D数组。其次,当您声明或定义数组时,必须指定(大小)除第一个之外的所有维度。

int (*array)[][2];   // This is a pointer to a 2D array of unknown size

现在可以在函数的主要变体中使用它。这是一个变种,因为我最初误读了你的问题。

void load(void)
{
    ...
    int tempArray[n][2];  // Note the reversed order of dimensions!
    ...
    array = &tempArray;
    ...there must be some code here calling functions that use array...
    array = 0;
}

请注意,分配需要数组名称上的&。在其他功能中,您需要编写:

n = (*array)[i][j];

另请注意,将本地数组的地址分配给全局变量是危险的。函数load()返回后,tempArray的存储空间不再有效。因此,进行赋值的唯一安全方法是调用引用全局变量的函数,然后在退出函数之前重置全局变量。 (或者,至少,认识到该值是无效的。但是将其设置为零 - 空指针 - 将更接近确保程序崩溃,而不是仅仅访问随机存储器。

或者,您需要进入数组的动态内存分配。

您的问题实际上是想要创建一个指向VLA,可变长度数组的全局指针,其中变量维度不是第一个:

int tempArray[2][n];  // Note the reversed order of dimensions!

您根本无法创建指向此类数组的全局指针。

所以,有很多问题:

  • 指向数组指针的表示法
  • 初始化指向数组的指针
  • 分配局部变量的全局指针
  • 您不能拥有指向变量长度不在第一维中的多维VLA的全局指针。
  • 你应该尽量减少使用全局变量。

答案 2 :(得分:0)

更优雅的版本可能是这样的:

typedef struct point_ { int x; int y; } point;

point * create_array(size_t n)
{
    return calloc(n, sizeof(point));
}

void free_array(point * p)
{
    free(p);
}

int main()
{
    size_t len = read_number_from_file();
    point * data = create_array(len);

    if (!data) { panic_and_die(); }

    for (size_t i = 0; i != len; ++i)
    {
        /* manipulate data[i].x and data[i].y */
    }

    free_array(data);
    data = 0;            /* some people like to do this */
}

答案 3 :(得分:0)

您正在尝试分配数组,但无法分配C数组。

使用memcpy将一个数组复制到另一个数组。 C中的数组元素保证是连续的。

int bla[N][M] = {0};
int blop[N][M];

/* Copy bla array to blop */
memcpy(blop, bla, sizeof blop);