衰变的多维数组从函数返回
与(gcc)Multi-Dim Array或Double Pointer for Warning-free Compile相关 ,有没有办法从函数中返回所谓的“衰减数组指针”? 总结(假设2 dim数组)返回int (*a)[5]
格式而不是int**
格式?
据我所知,当返回int**
指针被发送到另一个函数waiting (int*)[]
参数时,它无法正常工作。
是的,但语法看起来不太好
int(*f())[5] { static int a[1][5] = { { 1, 2, 3, 4, 5 } }; return a; }
基本上,它只是你a
f()
替换为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!
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; }
虽然,你真的是以错误的方式解决这个问题。