我需要存储一个点(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;
}
答案 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!
您根本无法创建指向此类数组的全局指针。
所以,有很多问题:
答案 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);