C中多次循环失败后出现段错误

Jac*_*b G 0 c for-loop pass-by-reference operator-precedence dynamic-memory-allocation

我正在做一个练习,创建一个数组并用整数填充元素。我首先将数组的长度输入到 malloc 中作为大小。然后,我在 for 循环中扫描数组中每个点的元素。

这是代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int scaning(int ** array){
    int size;
    scanf("%d", &size);
    *array = malloc(sizeof(int)*size);
    //printf("%d\n", size);
    for (int i=0; i<=size; i++){
        int num;
        scanf("%d", &num);
        *array[i] = num;
    }

    return size;
}


int main(){
    
    int * array;
    int zero;
    zero = scaning(&array);
    //printf("%d\n", zero);
    printf("LOOPS\n");
    for (int i=0; i<= zero; i++){
        printf("%d\n", array[i]);
    }
    return 0;
}

Run Code Online (Sandbox Code Playgroud)

在我输入元素填充数组两次后,出现段错误。我通常输入 5 个数组的大小,输入 2 个数字,然后它就会崩溃。不知道我哪里出错了。有任何想法吗?

Vla*_*cow 5

程序中的 for 循环如下所示

for (int i=0; i<=size; i++){
Run Code Online (Sandbox Code Playgroud)

具有无效条件i <= size。索引的有效范围是[0, size)

您需要使用条件i < size

另一个问题与运算符优先级有关。

代替

*array[i] = num;
Run Code Online (Sandbox Code Playgroud)

这相当于

*( array[i] ) = num;
Run Code Online (Sandbox Code Playgroud)

你需要写

( *array )[i] = num;
Run Code Online (Sandbox Code Playgroud)

或者至少

array[0][i] = num;
Run Code Online (Sandbox Code Playgroud)

该函数可以通过以下方式定义

size_t scaning( int **array )
{
    *array = NULL;

    size_t size = 0;
    scanf( "%zu", &size );

    if ( size != 0 ) *array = malloc( sizeof( int ) * size );

    if ( *array != NULL )
    {
        for ( size_t i = 0; i < size; i++ )
        {
            int num = 0;
            scanf( "%d", &num );
            ( *array )[i] = num;
        }
    }
    else
    {
        size = 0;
    }

    return size;
}
Run Code Online (Sandbox Code Playgroud)

相应地,变量zero(为什么命名为“零”?)也必须具有类型size_t

请注意,您应该释放 main 中分配的数组,例如

free( array );
Run Code Online (Sandbox Code Playgroud)