1

我在 RELIC 库中看到了这样定义的类型(fb_t)(此处的文档https://code.google.com/p/relic-toolkit/downloads/list):

#if ALLOC == AUTO
typedef align dig_t fb_t[FB_DIGS + PADDING(FB_BYTES)/(FB_DIGIT / 8)];
#else
typedef dig_t *fb_t;
#endif

align定义为/* empty */,如果重要的话)

所以它是一个指针,或者它是一个数组。但如果它是一个数组,那么这个函数将如何工作?(来自relic-doc/html/df/d96/relic__fb__util_8c_source.html#l00080

void fb_copy(fb_t c, const fb_t a) {
    for (int i = 0; i < FB_DIGS; i++) {
        c[i] = a[i];
    }
}

如果它是一个指针,这段代码将如何工作(因为它们是未初始化的指针)?

//create two variables 
fb_t source, target;
fb_copy(target,source); //and copy one to the other

两者都是从同一台计算机上运行的。在sizeof(fb_t)这台电脑上是 16。

4

2 回答 2

2

fb_copy无论fb_t是数组还是指针,上面的函数都能正常工作。那是因为数组和指针是等价的。

考虑一下(阅读评论):

    int a[10];
    int *ip;

    ip = a; 
    // this assignment is as if you have written ip = &a[0]
    // the first facet of equivalence

第二个是,您可以使用[i]访问数组元素的语法,也可以使用指针。

     int a = ip[3]
     //it is just as if you had written *(ip + 3)

等价,我们的意思是虽然指针和数组不同,但指针算术和数组索引是等价的和绑定的。

因此,在您指出的这种情况下,如果该函数传递了初始化的指针,它相当于*(c+i) = *(a+i)

于 2013-12-22T07:49:16.090 回答
1

但如果它是一个数组,那么这个函数将如何工作?

很好,谢谢。为什么它不起作用?

如果它是一个指针,这段代码将如何工作(因为它们是未初始化的指针)?

如果传递了未初始化的指针,它将不起作用(它会导致未定义的行为)。

但是:我强烈怀疑,由于 typedef 依赖于#ifdef(它似乎控制自动与动态内存分配),这种情况也以一种安全的方式被覆盖(即,使用未初始化fb_t对象的代码的任何部分都将被排除在外)编译时fb_t定义为指针。)

于 2013-12-22T07:39:36.910 回答