【发布时间】:2019-12-17 10:13:33
【问题描述】:
好的,我想了解它的作用:
#define NR_END 1
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;
}
我的意思是它创建了一个指向给定大小的 malloc 空间的指针。所以 v[0] 是第一个单元……以此类推直到块结束。
但是为什么最后返回了一些术语。
我以为你不能用指针移动堆栈上的任何地方,而只能访问给定的空间?
int main()
{
printf("Hello world\n\n");
float* f = vector(3,5);
f[0]=1;
f[1]=2;
f[2]=3;
f[7] = 5;
printf("%f", f[7]);
return 0;
}
我做了这些测试,当 gcc filename.c -o filename 编译时没有错误或警告。
为什么 v[7]=5 在不应该工作的情况下工作?
什么是下标范围?
你应该如何正确使用它?
我很困惑。请帮助我理解这一点。
该文件似乎也可以在 https://www.cfa.harvard.edu/~sasselov/rec/code/nrutil.c 上查看
【问题讨论】:
-
请注意,C 和 C++ 是两种截然不同的语言,具有不同的规则和语义。因此,请不要在您的问题中使用“C/C++”之类的术语或标记两种语言。这就是为什么 C++ 标记已被删除,因为它似乎不适用(因为您正在使用 C 编程)。
-
至于你的部分问题。 C没有任何边界检查。作为程序员,您有责任不超出分配的内存范围。越界会导致未定义的行为。
-
我们告诉了你它的作用和链接。这是未定义的行为,因为访问越界。这意味着我们实际上无法确定结果会是什么。
-
什么是
NR_END?在确定vector函数的返回值将是什么时,这似乎是关键 - 大概,它将总是 >nl,所以计算的返回值将从不小于v。