[英]C - random numbers array function [duplicate]
这个问题已经在这里有了答案:
我正在尝试创建一个函数,该函数创建一个大小为n的数组,里面存储有随机数,我一直在尝试几种选择,但是一旦我在main中使用该数组,就只能正确显示第一个数字。
我正在使用CodeBlock。
static int *arr;
int i, num;
printf("enter the length of the array: ");
scanf("%d/n", &num);
arr = get_random_arr(num);
for(i=0;i<num;i++)
{
printf("outside the function: %d\n", *(arr+i));
}
return 0;
int *get_random_arr(int num)
{
int temp_arr[num];
int i;
srand((unsigned)time(NULL));
for (i=0;i<num;i++)
{
temp_arr[i] = rand() % 1001 ;
printf("inside the function: %d\n",temp_arr[i]);
}
return temp_arr;
}
这是编译的代码:
enter the length of the array: 3 inside the function: 224 inside the function: 774 inside the function: 60 outside the function: 224 outside the function: 2686648 outside the function: 1977872892
感谢“ coderredoc”,他的回答是我正在寻找的解决方案
scanf("%d/n", &num);
您必须输入数字,后跟/
和n
。 这不是您想要的。 你想要这个
scanf("%d\n", &num);
但是在这里, scanf
读取num中的数字,然后继续读取直到找到非空格字符后跟\\n
。 您在这里不需要\\n
。
还返回return temp_arr;
并且在范围之外使用它是UB。
数组temp_arr
具有自动存储持续时间,这意味着其寿命将在函数结束后结束。 在其范围之外访问它是未定义的行为,这正是您所做的。
像这样
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int *get_random_arr(int num)
{
if( num <= 0){
fprintf(stderr, "%s\n", "Error in the number: num >= 1");
exit(1);
}
int *temp_arr = (int*)malloc( sizeof *temp_arr *num);
if( !temp_arr ){
fprintf(stderr, "%s\n", "Error in malloc");
exit(1);
}
srand((unsigned)time(NULL));
for(size_t i=0;i<num;i++)
{
temp_arr[i] = rand() % 1001 ;
printf("inside the function: %d\n",temp_arr[i]);
}
return temp_arr;
}
int main(){
static int *arr;
int num;
printf("enter the length of the array: ");
if( scanf("%d", &num) != 1){
fprintf(stderr, "%s\n","Error in input" );
exit(1);
}
arr = get_random_arr(num);
for(size_t i=0;i<num;i++)
{
printf("outside the function: %d\n", *(arr+i));
}
free(arr);
return 0;
}
该代码试图显示一种实现所需目标的可能方法。 动态分配的内存生存期超出了功能范围。 这就是为什么它起作用。 注意free()
-用于释放动态分配的内存。
在您的代码中,第一个也是最重要的一点, temp_arr
是函数get_random_arr()
局部变量。 函数完成后,返回的地址将不再有效!
尝试使用返回的值时,它会导致未定义的行为 ,因为在调用者的上下文中访问的内存无效 。
也就是说,不检查scanf()
的返回值也会带来问题。 万一scanf()
失败,您将最终使用单位化值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.