我正在尝试创建一个函数来创建一个大小为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”他的回答是我正在寻找的解决方案
答案 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()
失败,您将最终使用单位化值。