在我尝试学习一些有关指针的过程中,我尝试创建一个程序,为给定大小的数组分配内存(其中大小由常量ARR_SIZE
的值定义)并打印出元素该数组到控制台。
我无法理解我得到的结果......例如,当我运行下面显示的代码时,我得到{0, 4206628, 4206628, 3, 4, 5, 6, 2686696, 8, 9}
,这对我来说完全没有意义。我想知道这种行为的原因是什么,以及为了获得预期的结果需要修改的内容。
#define ARR_SIZE 10
void print_array(int loc);
int memory_alloc();
int main()
{
int array_loc = memory_alloc();
print_array(array_loc);
return 0;
}
void print_array(int loc)
{
int i = 0;
int *arr_ptr;
arr_ptr = loc;
while(i < ARR_SIZE)
{
printf("%d\n", *arr_ptr);
*(arr_ptr++);
i++;
}
}
int memory_alloc()
{
int array[ARR_SIZE];
int i = 0;
for(i; i < ARR_SIZE; i++)
{
array[i] = i;
}
return &array;
}
答案 0 :(得分:2)
您观察到的是未定义行为,因为在memory_alloc
中创建的数组仅存在于此函数的作用域中。程序离开后,该数组将不再存在。
另一种方法是在堆中分配数组:
int memory_alloc()
{
int *array = malloc(ARR_SIZE * sizeof(int));
int i = 0;
for(i; i < ARR_SIZE; i++)
{
array[i] = i;
}
return array;
}
使用完阵列后,应该将其释放。
int main()
{
int* array_pointer = memory_alloc();
// use array here
free(array_pointer);
return 0;
}
答案 1 :(得分:1)
int array[ARR_SIZE];
这里整数数组是函数的局部数,在函数结束后它将不再可用。
要使它工作,你可以这样做
static int array[ARR_SIZE];
并且
return array; //no need &
答案 2 :(得分:1)
您在memory_alloc()函数中声明的数组
int array[ARR_SIZE];
这个数组是一个局部变量。它的作用域在函数memory_alloc()中,一旦该函数返回,所有局部变量都被销毁(你的数组[]也是如此)
相反,在main()中声明数组,并将数组传递给memory_alloc()。