在 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);

这基本上是说分配 nsizeof(int) 字节的块。 您正在做的是分配 n 字节的数据。不能保证该程序始终 运行 并且您 运行 超出范围。如果幸运的话,您会在其中一个 运行 中得到一个 Segmentation Fault

您没有分配足够的 space。 malloc(n) 分配 n 字节。 n 整数需要 space!使用 malloc(n * sizeof(int)),或者更优选:malloc(n * sizeof(*array))(这样您就不需要重复类型)。

这个内存分配

int* array = malloc(n);

为具有 nint 类型元素的数组分配的内存不足,您必须编写

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