动态内存分配错误的结果

Ani*_*sal 0 c numerical-methods

我试图通过该程序找出拉格朗日的插值.我用数组解决了它,但是当使用动态内存分配时,程序给了我垃圾结果.

#include<stdio.h>
#include<conio.h>
#define SIZE 100

int main()
{
    float *x,*y;
    float value = 0,ask,temp;
    int i,j,n;
    printf("Enter size");
    scanf("%d",&n);
    x = (float*)malloc(n*sizeof(float));
    y = (float*)malloc(n*sizeof(float));
    for(i = 0; i < n;i++)
    {
            printf("x[%d]: ",i);
            scanf("%f",(x+i));
            printf("y[%d]: ",i);
            scanf("%f",(y+i));
    }
    printf("Enter value to find");
    scanf("%f",&ask); //cin >> ask;
    for(i = 0; i < n;i++)
    {
        temp = 1;
        for(j = 0; j < n; j++)
        {
            if(i != j)
            {
                temp = temp * (ask-(*(x+i))/(*(x+i)-*(x+j)));
            }
        }
        value = value + temp * *(y+i);
    }
    printf("%f",value); 
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*ter 7

您需要#include <stdlib.h>,因为这是声明执行动态内存分配(malloc()等)的函数的标头.

假设您使用的是C编译器而不是C++编译器,您会发现malloc()调用的类型转换不是必需的.

x = (float*)malloc(n*sizeof(float));      /*   (float *) is unnecessary */
Run Code Online (Sandbox Code Playgroud)

问题是,如果没有stdlib.h,编译器会假定malloc()返回一个int.类型转换可能允许代码在没有编译的情况下编译stdlib.h,但结果是malloc()d指针的后续使用将具有未定义的行为,因为指针不一定能够在往返行程中存活(转换为int然后返回).

如果您使用的是C++编译器,则需要(float *)类型转换AND #include <stdlib.h>以避免未定义的行为.