繁体   English   中英

C - 函数返回一个数组

[英]C - function returns an array

我正在编写一个接收数字l的方法,并返回一个带有随机数的大小为l的向量。 我有这个代码,但不起作用

#include <time.h>    

 int makea (int z) {
    int a1[z];
    int i;

    for (i = 0; i < tam; i++) {
        a1[i]=srand(time(0));
    }
    return a1;
 }

这些是编译器返回的错误

arrays1.c:在函数'makea'中:
arrays1.c:12:错误:void值不应该被忽略,因为它应该是
arrays1.c:14:warning:return在没有强制转换的情况下从指针生成整数
arrays1.c:14:warning:function返回局部变量的地址

我认为这是指针的问题......但我不太确定

一些问题:

  1. 您的数组在堆栈上分配,这意味着当您的函数退出时,您返回的内存将无效
  2. 在C中,您不能从函数返回数组,它必须首先衰减成指针。

因此,要修复,请使用malloc和指针:

int *makea (int z) {
    int *a1 = malloc(sizeof(int) * z);
    int i;

    srand(time(NULL));
    for (i = 0; i < tam; i++) {
        a1[i]= rand();
    }

    // remember to free a1 when you are done!
    return a1;
}

另请注意,使用malloc 有时基本上可以免费授予您“随机数”场景,从而无需循环遍历元素,因为从malloc返回的值是垃圾(因此是随机数)。

但是,请注意malloc是特定于实现的 ,这意味着实现理论上可以在返回之前为您清除内存。

你最好的选择是:

  1. 在例程之外声明数组,并将其传入以初始化它:

    void init_array (int a[], nelms)

  2. 计划B传递一个指向指针的指针,并让例程分配并初始化它

像这样:

void alloc_and_init_array (int **a_pp, int nelms)
{
  *a_pp = malloc (sizeof (int) * nelms);
  ...

......或者,等同地......

int *
alloc_and_init_array (int nelms)
{
  int *a_p = malloc (sizeof (int) * nelms);
  ...
  return a_p;

好吧,首先关闭你的函数说它返回一个int,但你想返回一个数组,所以这是错误的。 当然,你不能在C中返回数组......

其次,你必须返回一个指针。 您无法通过赋值复制数组或者在C中为数组分配新值,因此您的函数不会非常有用。 要么返回一个int*要么将一个int**作为输出参数并在函数中初始化它。

此外,您的数组是本地分配的,因此即使编译器没有抱怨您将返回无效的内存。

int makea (int size, int **out_array) {
    int *temp, i;
    if(!out_array)
        return 0;
    temp = malloc(sizeof(int) * size);
    if(!temp)
        return 0;

    srand(time(0));
    for (i = 0; i < size; ++i) 
        temp[i] = rand();        

    *out_array = temp;
    return 1;
 }

int main() {
    int *arr;
    if(!makea(10, &arr)) {
        printf("Failed to allocate array");
        return -1;   
    }

    return 0
}

另一个说明:

temp[i] = srand(time(0));        

那是错的。 srand种子随机数生成器,但不返回随机数。 你调用srand来输入种子,然后调用rand来获得一个随机数。

像堆栈这样的局部变量在堆栈上分配。 在函数返回时,它将从堆栈中删除,因此返回的指针指向未分配的内存位置。

您必须使用malloc()分配数组或将已存在的数组传递给该函数。

#include <time.h>    

int makea (int z) {
    int *a1 = (int*)malloc(z*sizeof(int));
    int i;

    for (i = 0; i < tam; i++) {
        a1[i]=srand(time(0));
    }

    return a1;
}

重要提示:当你不再需要时,请记得释放在外面某处分配的内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM