C - 函数返回一个数组

时间:2012-03-15 22:49:04

标签: c arrays methods

我正在编写一个接收数字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返回局部变量的地址

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

5 个答案:

答案 0 :(得分:6)

一些问题:

  1. 您的数组已在堆栈中分配,这意味着当您的函数退出时,您返回的内存将无效
  2. 在C中,你不能从函数返回一个数组,它必须首先衰减成一个指针。
  3. 因此,要修复,请使用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 :(得分:1)

你最好的选择是:

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

    void init_array (int a[], nelms)

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

  3. 像这样:

    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;
    

答案 2 :(得分:0)

好吧,首先关闭你的函数说它返回一个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以获取随机数。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

#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;
}

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