繁体   English   中英

C-随机数数组函数

[英]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.

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