C语言函数返回一个数组

3
我正在编写一个方法,接收一个数字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: 警告:返回指针时未进行强制类型转换产生整数
arrays1.c:14: 警告:函数返回本地变量的地址

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


2
在C语言中,你无法从函数中返回数组,你需要返回一个指向数组的指针。尝试使用malloc来创建你的数组。 - Hunter McMillen
1
首先,这是一个非常基础的问题,答案在任何一本 C 书(K&R、c-faq)中都有。2)当您提供错误输出时,请确保标记代码中的行(12、14)(从 IDE 复制和粘贴或手动执行)。 - Tomas Pruzina
顺便提一下,C语言不使用“方法”,而是使用函数。 - Tomas Pruzina
5个回答

7

有几个问题:

  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是实现特定的,这意味着一个实现在返回内存之前理论上可以清除内存。


Malloc不一定会返回指向垃圾的指针。在某些系统上,未分配的堆内存在启动时设置为特定值以帮助调试。根据用随机数据填充数组的原因,这样做可能是完全必要的。 - Chris Browne
1
@ChrisBrowne 正确,您在评论之前我已经更新了我的帖子,显然它还没有在服务器端更新。 - Richard J. Ross III
srand 用于初始化生成器,不返回任何值。我知道你只是在使用 OP 的代码,但为了准确起见... - Ed S.
@asaelr 嗯,我从来没有听说过这种情况,但如果存在未定义行为,任何事情都有可能发生。 - Richard J. Ross III
这个工作!现在我的工作是生成二维数组。感谢大家,特别是@RichardJ.RossIII :D - patz
显示剩余2条评论

1

你最好的选择是:

  1. 在程序外部声明数组,并将其传递到初始化函数中进行初始化:

    void init_array (int a[], nelms)

  2. 备选方案是传递指向指针的指针,并让函数分配和初始化它

像这样:

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;

@patz(2)解决了所提出的问题,但请认真查看是否(1)适合您。使用(2),使用返回值来标记成功创建数组。 - Keith

0
首先,你的函数声明返回一个整型,但是你想要返回一个数组,这是错误的。当然,在 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 来获取随机数。


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

重要提示:当您不再需要分配的内存时,请记得释放在其他地方分配的内存。


0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接