为什么使用宏定义malloc(数字配方)提供的所有可用内存的FREE_ARG char*

为什么使用宏定义malloc(数字配方)提供的所有可用内存的FREE_ARG char*,c,casting,macros,malloc,free,C,Casting,Macros,Malloc,Free,我正在研究一些数值公式中的例程,但我不了解宏define FREE_ARG char*在释放内存的实现中的用法。下面是一段代码: #include <stdio.h> #include <stddef.h> #include <stdlib.h> #define NR_END 1 #define FREE_ARG char* float *vector(long nl, long nh) /* allocate a float vector with sub

我正在研究一些数值公式中的例程,但我不了解宏define FREE_ARG char*在释放内存的实现中的用法。下面是一段代码:

#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#define NR_END 1
#define FREE_ARG char*

float *vector(long nl, long nh)
/* allocate a float vector with subscript range v[nl..nh] */
{
    float *v;

    v=(float *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(float)));
    if (!v) nrerror("allocation failure in vector()");
    return v-nl+NR_END;
}


void free_vector(float *v, long nl, long nh)
/* free a float vector allocated with vector() */
{
    free((FREE_ARG) (v+nl-NR_END));
\\           ^
\\           '----- why?
}

我的问题是:为什么内存以这种方式释放freeFREE_ARG v+nl-NR_END

这可能是一个非常糟糕的代码。注意

free接受参数类型void*。任何指针类型都可以隐式转换为void*,无需强制转换

注:

在这一行

 v=(float *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(float)));

铸造也是不需要的,应该避免。这也是早期使用bad的原因之一。

。整个代码看起来是个非常糟糕的主意。这不仅是因为不鼓励强制转换,还因为它允许释放以前不一定由malloc分配的指针。至少这些指针操作容易出错。也许这是一些标准前的代码,但对于标准C来说,这可能是非法的,因为大约28年了。也就是说,你应该得到一本关于C代码的最新书籍,或者把这本书作为你的想法,但是用正确的C实现函数。更重要的是,由于指针算术错误,代码表现出未定义的行为,除非nl==0。@EOF通常是正确的,但是,我们不这样做;我不知道它的用法。请注意return语句。看起来像一些标准前的垃圾。对于现代编译器来说,这段代码是一场灾难。根据我在C语言中使用数字公式的一点经验,这不仅是预标准,而且是用C语言编写的文字Fortran代码。NR_END的加减调整了从1到0的取舍。在我看到的一个快速排序例程中,代码使用l作为左索引,但使用ir作为右索引,因为在Fortan中隐式键入会使以I到n开头的所有内容都成为整数,而其他所有内容都是实数。这本书没有包含C语言的特点,这会导致糟糕的代码。@SouravGhosh:你总是使用更礼貌的措辞。我只是想更直接地说:-