我试图设置一个指针函数,返回存储在本地的数组的第一个元素的地址,然后在另一个函数上使用(在这种情况下打印)内容。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <stdbool.h>
double *n(int a)
{
int i;
double array[' '];
for(i=0;i<a;i++)
{
array[i] = rand();
printf("n element: %f tnn", array[i]);
}
return array;
}
void exe()
{
double *unfixed;
int c, b, j;
scanf("%d", &b);
unfixed = n(b);
printf("nn Precoded acces value %f nn", *(unfixed + c));
for(j=0;j<b;j++)
{
printf("n %f", *(unfixed + j));
}
return;
}
int main()
{
exe();
return 0;
}
当我通过静态语句引用它时,它可以正常工作,例如:
printf("nn %f nn", *(unfixed + c));
相反,当我继续尝试做一个循环或决定时,它只是直接不起作用。
p。d。:由于某些不正当的原因,它可以完美地与int类型的指针函数配合使用。
心理虐待的进一步证据函数n
返回一个指针,该指针指向本地数组的第一个元素,该指针具有自动存储时间,在退出该函数后将不再存在。因此返回的指针无效。对这样的指针解引用会调用未定义的行为。
可以将数组声明为具有静态存储持续时间
static double array[' '];
或动态分配数组
但是在任何情况下,这个函数都是不安全的,因为没有检查a
是否大于作为数组大小的整数字符量' '
的值。
在函数exe
中,您还使用了在此语句中未初始化的变量c
printf("nn Precoded acces value %f nn", *(unfixed + c));
再次调用未定义行为。