我在C语言中有如下函数:
int[] function(int a){
int * var = (int*)malloc(sizeof(int)*tags);
....
}
*var
是指向数组var
的指针吗?
如果是,如何在函数中返回该数组(var
)?
你不能真正从函数返回一个数组,但可以返回指针:
int * function(int a){
int * var = malloc(sizeof(int)*tags);
//....
return var;
}
#include <stdio.h>
#include <stdlib.h>
int *function(unsigned int tags) {
int i;
int *var = malloc(sizeof(int)*tags);
for (i=0; i < tags; i++) {
var[i] = i;
}
return var;
}
int main() {
int *x;
int i;
x = function(10);
for (i=0; i < 10; i++) {
printf("TEST: %i\n", x[i]);
}
free(x); x=NULL;
return 0;
}
怎么样:
int* function(int tags){
int * var = malloc(sizeof(int)*tags);
//....
return var;
}
在C/C++中,数组和指向基本元素类型的指针(大多数情况下)是同义词,因此您可以返回指向数组第一个元素的指针,并将其用作数组本身。
请注意,您的代码具有输入参数a
,但使用tags
来分配数组的内存。我假设您希望在上述代码中使用输入参数来实现这一目的。
此外,当您不再使用数组时,必须调用function
返回的指针上的free()
,以避免内存泄漏。上面的malloc
分配了足够容纳tags
个int
的内存,因此该数组等效于int var[tags];
更新:删除malloc
返回值的强制转换
在 C 语言中,函数无法返回数组类型。针对您的需求,您可以返回一个指向 int
的指针:
int *function(int a)
{
int *var = malloc(sizeof *var * tags); // where is tags defined?
// are you sure you don't mean a here?
...
return var;
}
这将分配一个足够大的内存块来容纳tags
个整数值,并将该块的第一个元素的地址分配给var
。请注意,var
是指向int
而不是指向int
数组的指针。该指针是从函数返回的。
您可以在指针表达式上使用下标运算符,就像它是一个数组一样:
int a = ...;
int *arr = function(a);
...
arr[0] = 0;
arr[1] = 1;
...
arr
是一个指针表达式,而不是数组表达式,因此 sizeof arr
将返回指针类型的大小,而不是它所指向的内存块的大小(因此,您需要单独跟踪分配的元素数量)。
#include <stdio.h>
#include <stdlib.h>
int* foo(size_t arrSize){
int* arr = (int*) malloc(sizeof(int)*arrSize);
return arr;
}
int main (int argc, char** argv){
printf("Printing array:\n");
int* arr = foo(42);
for(int i=0; i <42; i++){
arr[i]=i;
}
for (int i=0; i < 42; i++){
printf("Element: %d: %d\n", i, arr[i]);
}
free(arr);
return 0;
}
char[]
和char *
仅在函数参数声明的上下文中才相同,在其他任何地方都不相同。 - John Bode
T *var = malloc(sizeof(*var) * NUM);
来分配内存空间,同时建议在调用函数中由调用者而非被调用者分配内存空间。 - Matt