C - 随机数数组函数

时间:2017-12-07 17:04:11

标签: c arrays function

我正在尝试创建一个函数来创建一个大小为n的数组,其中存储有随机数,我一直尝试了几个选项,但是一旦我在main中使用该数组,只有第一个数字正确显示。

顺便说一句,我正在使用CodeBlock。

game.display("String value here");

这是编译的代码:

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

感谢“coderredoc”他的回答是我正在寻找的解决方案

2 个答案:

答案 0 :(得分:1)

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() - 用于释放动态分配的内存。

答案 1 :(得分:0)

首先,在您的代码中,temp_arr是函数get_random_arr()的本地。函数完成后,返回的地址不再有效!

当您尝试使用返回的值时,它会导致undefined behavior,因为在调用者的上下文中访问的内存无效

也就是说,不检查scanf()的返回值也存在问题。如果scanf()失败,您将最终使用单位化值。