在 C 中制作随机整数数组时的奇怪问题
Weird issue when making an array of random ints in C
我目前正在学习 C,我需要编写一个函数来创建一个随机整数数组。我遇到了一个问题,创建后我尝试打印它并正确打印前 8 个数字,但其余数字没有。
int* create(int n) {
int* array = malloc(n);
if (!array) return NULL;
srand(time(NULL));
for (int i = 0; i < n; i++) {
array[i] = rand() % 100 + 1;
printf("num: %i\n", array[i]);
}
for (int i = 0; i < n; i++) {
printf("%i\n", array[i]);
}
return array;
}
这是我的输出结果:
num: 39
num: 2
num: 15
num: 74
num: 80
num: 29
num: 14
num: 16
num: 8
num: 11
num: 2
39
2
15
74
80
29
14
16
973747761
909588276
2614
您的代码存在问题:
malloc
期望一个 size_t
,你直接给出一个 int
。所以你应该在技术上做:
int *array = malloc(sizeof(int) * n);
这基本上是说分配 n
个 sizeof(int)
字节的块。
您正在做的是分配 n
字节的数据。不能保证该程序始终 运行 并且您 运行 超出范围。如果幸运的话,您会在其中一个 运行 中得到一个 Segmentation Fault
。
您没有分配足够的 space。 malloc(n)
分配 n
字节。 n
整数需要 space!使用 malloc(n * sizeof(int))
,或者更优选:malloc(n * sizeof(*array))
(这样您就不需要重复类型)。
这个内存分配
int* array = malloc(n);
为具有 n
个 int
类型元素的数组分配的内存不足,您必须编写
int* array = malloc( n * sizeof( int ) );
此外,参数应为无符号整数类型。否则,用户可以传递一个负整数,这将导致未定义的行为。
最好将参数声明为 size_t
类型。是函数参数的类型 malloc
.
并且该函数应该做一件事:分配和初始化一个数组。如果函数没有 return 空指针,则函数的调用者将决定是否输出数组。
所以函数看起来像
int * create( size_t n )
{
const int MAX_VALUE = 100;
int *array = malloc( n * sizeof( int ) );
if ( array != NULL )
{
srand( ( unsigned int )time( NULL ) );
for ( size_t i = 0; i < n; i++ )
{
array[i] = rand() % MAX_VALUE + 1;
}
}
return array;
}
这是一个演示程序。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int * create( size_t n )
{
const int MAX_VALUE = 100;
int *array = malloc( n * sizeof( int ) );
if ( array != NULL )
{
srand( ( unsigned int )time( NULL ) );
for ( size_t i = 0; i < n; i++ )
{
array[i] = rand() % MAX_VALUE + 1;
}
}
return array;
}
int main(void)
{
size_t n = 0;
printf( "Enter the size of an array: " );
scanf( "%zu", &n );
int *array = create( n );
if ( array != NULL )
{
for ( size_t i = 0; i < n; i++ )
{
printf( "%d ", array[i] );
}
putchar( '\n' );
}
free( array );
return 0;
}
它的输出可能看起来像
Enter the size of an array: 10
75 36 30 75 53 49 42 52 61 9
虽然最好以用户可以自己确定最大值的方式声明函数。那就是函数看起来像
int * create( size_t n, int max_value )
{
int *array = malloc( n * sizeof( int ) );
if ( array != NULL )
{
srand( ( unsigned int )time( NULL ) );
for ( size_t i = 0; i < n; i++ )
{
array[i] = rand() % max_value + 1;
}
}
return array;
}
我目前正在学习 C,我需要编写一个函数来创建一个随机整数数组。我遇到了一个问题,创建后我尝试打印它并正确打印前 8 个数字,但其余数字没有。
int* create(int n) {
int* array = malloc(n);
if (!array) return NULL;
srand(time(NULL));
for (int i = 0; i < n; i++) {
array[i] = rand() % 100 + 1;
printf("num: %i\n", array[i]);
}
for (int i = 0; i < n; i++) {
printf("%i\n", array[i]);
}
return array;
}
这是我的输出结果:
num: 39
num: 2
num: 15
num: 74
num: 80
num: 29
num: 14
num: 16
num: 8
num: 11
num: 2
39
2
15
74
80
29
14
16
973747761
909588276
2614
您的代码存在问题:
malloc
期望一个 size_t
,你直接给出一个 int
。所以你应该在技术上做:
int *array = malloc(sizeof(int) * n);
这基本上是说分配 n
个 sizeof(int)
字节的块。
您正在做的是分配 n
字节的数据。不能保证该程序始终 运行 并且您 运行 超出范围。如果幸运的话,您会在其中一个 运行 中得到一个 Segmentation Fault
。
您没有分配足够的 space。 malloc(n)
分配 n
字节。 n
整数需要 space!使用 malloc(n * sizeof(int))
,或者更优选:malloc(n * sizeof(*array))
(这样您就不需要重复类型)。
这个内存分配
int* array = malloc(n);
为具有 n
个 int
类型元素的数组分配的内存不足,您必须编写
int* array = malloc( n * sizeof( int ) );
此外,参数应为无符号整数类型。否则,用户可以传递一个负整数,这将导致未定义的行为。
最好将参数声明为 size_t
类型。是函数参数的类型 malloc
.
并且该函数应该做一件事:分配和初始化一个数组。如果函数没有 return 空指针,则函数的调用者将决定是否输出数组。
所以函数看起来像
int * create( size_t n )
{
const int MAX_VALUE = 100;
int *array = malloc( n * sizeof( int ) );
if ( array != NULL )
{
srand( ( unsigned int )time( NULL ) );
for ( size_t i = 0; i < n; i++ )
{
array[i] = rand() % MAX_VALUE + 1;
}
}
return array;
}
这是一个演示程序。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int * create( size_t n )
{
const int MAX_VALUE = 100;
int *array = malloc( n * sizeof( int ) );
if ( array != NULL )
{
srand( ( unsigned int )time( NULL ) );
for ( size_t i = 0; i < n; i++ )
{
array[i] = rand() % MAX_VALUE + 1;
}
}
return array;
}
int main(void)
{
size_t n = 0;
printf( "Enter the size of an array: " );
scanf( "%zu", &n );
int *array = create( n );
if ( array != NULL )
{
for ( size_t i = 0; i < n; i++ )
{
printf( "%d ", array[i] );
}
putchar( '\n' );
}
free( array );
return 0;
}
它的输出可能看起来像
Enter the size of an array: 10
75 36 30 75 53 49 42 52 61 9
虽然最好以用户可以自己确定最大值的方式声明函数。那就是函数看起来像
int * create( size_t n, int max_value )
{
int *array = malloc( n * sizeof( int ) );
if ( array != NULL )
{
srand( ( unsigned int )time( NULL ) );
for ( size_t i = 0; i < n; i++ )
{
array[i] = rand() % max_value + 1;
}
}
return array;
}