-1

我正在尝试设置一个指针函数,该函数返回一个数组的第一个元素的地址,该数组本身存储在本地,然后在另一个函数上使用(在本例中为打印)内容。

#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 \t\n\n", array[i]);
    
      }

    return array;

}

void exe()
{

    double *unfixed;
    int c, b, j;

    
    scanf("%d", &b);
    unfixed = n(b);

    printf("\n\n Precoded acces value %f \n\n", *(unfixed + c));

    for(j=0;j<b;j++)
    {
        printf("\n %f", *(unfixed + j));
    } 

    return;
}

int main()
{

    exe();

    return 0;

}

当我通过静态语句引用它时,它可以正常工作,例如:

printf("\n\n %f \n\n", *(unfixed + c));

相反,当我继续尝试获得一个循环或做出决定时,它只是直截了当是行不通的。

PD:也出于某些邪恶的原因,它与 int 类型指针函数完美配合。

心理虐待的进一步证据

4

1 回答 1

1

该函数n返回一个指向具有自动存储持续时间的本地数组的第一个元素的指针,该元素在退出函数后将不再存在。所以返回的指针是无效的。取消引用这样的指针会调用未定义的行为。

您可以将数组声明为具有静态存储持续时间

static double array[' '];

或动态分配数组。

但在任何情况下,该函数都是不安全的,因为没有检查是否a不大于' '用作数组大小的整数字符文字的值。

同样在函数exe中,您使用的c是未在此语句中初始化的变量

printf("\n\n Precoded acces value %f \n\n", *(unfixed + c));

这再次调用未定义的行为。

于 2021-10-02T08:37:24.753 回答