我正在阅读这个问题:Cannot return int array因为我遇到了同样的问题。
似乎无法返回在函数内本地声明的数据结构(因为C显然可以返回本地声明的变量),在这种情况下是一个数组。
然而,Python并没有遭受同样的问题;据我所知,可以在函数中声明一个数组并返回该数组,而不必将其作为参数传递。
有什么不同"引擎盖"? Python是否隐式使用指针(在函数中使用malloc)?
答案 0 :(得分:5)
对于记录,Python的内置可变序列类型称为list
,而不是数组,但它的行为类似(它只是动态可调整大小,如C ++的std::vector
)。
无论如何,你是正确的,所有Python对象都是隐式动态分配的;只有它们的引用(粗略地,指针)在“堆栈”上(也就是说,Python解释器堆栈和C级堆栈与开始时不一样)。可比较的C代码将动态分配数组并返回指向它的指针(完成时调用者free
;不同的Python解释器以不同方式处理它,但list
在不再引用时将被垃圾收集以这种或那种方式)。
Python没有“堆栈数组”的真正概念(它总是返回单个对象,尽管该对象可以是tuple
来模拟多个返回值),因此返回总是最终是一个“指针”值(对返回对象的引用)。
答案 1 :(得分:1)
似乎无法返回在函数内本地声明的数据结构(因为C显然可以返回本地声明的变量),在这种情况下是一个数组。
你已经有了很好的Python答案;我想更仔细地看一下C面。
是的,C函数返回值。该值可以是原始C类型,也可以是struct
或union
类型。或者,它可能是指针类型。
C语言语法使得数组和指针看起来非常相似,这使得数组特殊。因为数组的名称与第一个元素的地址相同,所以它不可能是其他元素。特别是,数组名称不引用整个数组(sizeof
运算符除外)。由于数组名称的任何其他使用都是指第一个元素的地址,因此尝试返回数组会导致仅返回该地址。
因为它是一个C函数,所以地址按值返回:即指针类型的值。所以,当我们说,
char *s = strdup("hello");
s
是一个指针类型,其值为 not " hello",但是strdup
数组的第一个元素的地址值分配。
Python不会遇到同样的问题
当Y是X的属性时,Y是问题,只有在旁观者眼中该属性是不合需要的。您可以确定C处理数组的方式不是偶然的,并且通常很方便。