衰变的多维数组从函数返回

时间:2010-03-27 11:13:50

标签: c arrays pointers

(gcc) Multi-Dim Array or Double Pointer for Warning-free Compile有关,有没有办法从函数中返回所谓的“衰减数组指针”?总结(假设2 dim数组)返回int (*a)[5]格式而不是int**格式?

据我所知,当返回的int**指针被发送到另一个等待(int*)[]参数的函数时,它无法正常工作。

2 个答案:

答案 0 :(得分:4)

是的,但语法看起来不太好

int(*f())[5] {
  static int a[1][5] = { { 1, 2, 3, 4, 5 } };
  return a;
}

基本上,只有a替换为f()(一个函数)。使用typedef它变得更具可读性

typedef int inner_array[5];

inner_array *f() {
  // like before ...
}

请注意,要表示没有名称的抽象类型,您需要编写int(*)[5]。也就是说,你只需删除名称。 (int*)[5]是无效的语法。

你是对的 - 你不能返回int**,因为这意味着你有一个指针指针。使用f()[A][B]进行访问将从返回的指针给出的地址读取,然后从该指针依次给出的地址再次读取。但事实上,您返回的数组指针只指向一个内存块,因此如果您要进行两个间接,则会尝试将数据重新解释为指针。

相反,如果您返回int(*)[5]并执行f()[A][B],则不会从指针返回的地址中读取任何值。相反,您只需将偏移量A添加到地址,并将类型从int(*)[5]调整为int[5],以使数组在调整后的地址处引用内存。然后下一个索引将再次调整B,因为它在int*上运行然后(在数组衰减之后),不再是数组指针,它将读取存储在调整后的地址的内容,最终得出int。这是非数组指针和数组指针的重要区别。

如果需要,您可以尝试使用此功能。考虑这两个片段。一个可能会崩溃,但另一个可能不会崩溃(但两者都会产生未定义的行为,所以这不应该在实际程序中完成)

int *pi = 0; 
int(*pa)[5] = 0;

int i = *pi; // read int stored at null-pointer address!
int *a = *pa; // does not read any data from address, just adjusts the type!

答案 1 :(得分:0)

struct thing {
   int A[10][10];
};

typedef struct thing thing_t;

thing_t f1(void) {
    thing_t t;
    ...
    return t;
}
thing_t * f1(void) {
   thing_t * tp;
   ...
   return tp;
}

尽管如此,你真的是以错误的方式解决这个问题。