我在C中有以下功能:
int[] function(int a){
int * var = (int*)malloc(sizeof(int)*tags);
....
}
*var
它是指向数组var
的指针吗?
如果是,我如何在函数中返回数组(var
)?
答案 0 :(得分:18)
你不能真正从一个函数返回一个数组,而是一个指针:
int * function(int a){
int * var = malloc(sizeof(int)*tags);
//....
return var;
}
答案 1 :(得分:1)
下面的代码可以澄清数组和指针的工作原理。 该函数将为“tags”int变量分配内存,然后它将使用数字初始化每个元素并返回指向数组的内存段。 从main函数我们将循环并打印数组元素,然后我们将释放不再需要的内存。
#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;
}
答案 2 :(得分:1)
在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
数组的指针。该指针是从函数返回的内容。
您可以在指针表达式上使用下标oprerator,就像它是一个数组一样,如下所示:
int a = ...;
int *arr = function(a);
...
arr[0] = 0;
arr[1] = 1;
...
arr
是指针表达式,而不是数组表达式,因此sizeof arr
将返回指针类型的大小,而不是它指向的内存块的大小(因此,你需要跟踪你单独分配的元素数量)。
答案 3 :(得分:0)
怎么样:
int* function(int tags){
int * var = malloc(sizeof(int)*tags);
//....
return var;
}
基本元素类型的数组和指针在C / C ++中(大多数)是同义的,因此您可以返回指向数组第一个元素的指针,并将其用作数组本身。
注意,您的代码有一个输入参数a
,但使用tags
为数组分配内存。我在上面的代码中假设你想为此目的使用输入参数
此外,当您不再使用数组时,您必须在上面free()
返回的指针上调用function
,以避免内存泄漏。上面malloc
分配的内存足以容纳tags
个int
个,因此数组相当于int var[tags];
更新:删除了malloc
的回复
答案 4 :(得分:-2)
在C中,数组与指向数组元素的指针基本相同。 所以char []基本上是char *
不要忘记跟踪数组的大小,我也注意到标签似乎是一个全局变量,大多数情况下避免全局变量是个好主意
以下是一些示例代码:
#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;
}