我正在编写一个接收数字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返回局部变量的地址
我认为这是一个指针问题......但我不太确定
答案 0 :(得分:6)
一些问题:
因此,要修复,请使用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)
你最好的选择是:
在例程之外声明数组,并将其传入以初始化它:
void init_array (int a[], nelms)
计划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;
答案 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;
}
重要提示:当你不再需要时,请记得释放分配到外面的内存。