为什么Python函数可以返回本地声明的数组,但C不能?

时间:2017-01-31 01:34:08

标签: python c arrays pointers

我正在阅读这个问题:Cannot return int array因为我遇到了同样的问题。

似乎无法返回在函数内本地声明的数据结构(因为C显然可以返回本地声明的变量),在这种情况下是一个数组。

然而,Python并没有遭受同样的问题;据我所知,可以在函数中声明一个数组并返回该数组,而不必将其作为参数传递。

有什么不同"引擎盖"? Python是否隐式使用指针(在函数中使用malloc)?

2 个答案:

答案 0 :(得分:5)

对于记录,Python的内置可变序列类型称为list,而不是数组,但它的行为类似(它只是动态可调整大小,如C ++的std::vector)。

无论如何,你是正确的,所有Python对象都是隐式动态分配的;只有它们的引用(粗略地,指针)在“堆栈”上(也就是说,Python解释器堆栈和C级堆栈与开始时不一样)。可比较的C代码将动态分配数组并返回指向它的指针(完成时调用者free;不同的Python解释器以不同方式处理它,但list在不再引用时将被垃圾收集以这种或那种方式)。

Python没有“堆栈数组”的真正概念(它总是返回单个对象,尽管该对象可以是tuple来模拟多个返回值),因此返回总是最终是一个“指针”值(对返回对象的引用)。

答案 1 :(得分:1)

  

似乎无法返回在函数内本地声明的数据结构(因为C显然可以返回本地声明的变量),在这种情况下是一个数组。

你已经有了很好的Python答案;我想更仔细地看一下C面。

是的,C函数返回。该值可以是原始C类型,也可以是structunion类型。或者,它可能是指针类型。

C语言语法使得数组和指针看起来非常相似,这使得数组特殊。因为数组的名称与第一个元素的地址相同,所以它不可能是其他元素。特别是,数组名称不引用整个数组(sizeof运算符除外)。由于数组名称的任何其他使用都是指第一个元素的地址,因此尝试返回数组会导致仅返回该地址。

因为它是一个C函数,所以地址按值返回:即指针类型的值。所以,当我们说,

char *s = strdup("hello");

s是一个指针类型,其值为 not " hello",但是strdup数组的第一个元素的地址值分配。

  

Python不会遇到同样的问题

当Y是X的属性时,Y是问题,只有在旁观者眼中该属性是不合需要的。您可以确定C处理数组的方式不是偶然的,并且通常很方便。