C code showing the error : *** stack smashing detected ***: <unknown> terminated Aborted (core dumped)

C code showing the error : *** stack smashing detected ***: <unknown> terminated Aborted (core dumped)

我在 C 中有一个程序将一个数组分成两个 sub_arrays ,它完美地给出了偶数和奇数 array.length 的结果,但我有这个错误:

*** stack smashing detected ***: <unknown> terminated
Aborted (core dumped) 

这是 C 代码:

#include <stdio.h>

#define N 7

int arr[N] = {1, 2, 3, 4, 5, 6, 7};

void print(int *array, int start , int finish)
{
    for(int i = start ; i < finish ; i++)
    {
        printf("%d ", array[i]);
        if(i == finish - 1)
            printf("\n");
    }
}
void init(int *array, int start, int finish)
{
    for(int i = start ; i < finish ; i++)
        array[i] = arr[i];
}
int main()
{
    int left[N/2];
    int right[N/2];
    init(left,0,N/2);
    init(right,N/2,N);

    print(left,0,N/2);
    print(right,N/2,N);

    return 0;
}

您声明了一个包含 3 个元素的数组

#define N 7

//...

int right[N/2];

但是您正在尝试访问函数 init

中超出数组的元素
void init(int *array, int start, int finish)
{
    for(int i = start ; i < finish ; i++)
        array[i] = arr[i];
}

由于这次通话

init(right,N/2,N);

数组 right 的有效索引范围是 [0, N / 2 ) 但在函数中您使用的索引范围是 [N /2, N ).

函数的调用存在同样的问题print

print(right,N/2,N);

数组right必须声明为

int right[N - N / 2];

例如,函数 init 应该定义为

void init( int *a1, size_t n, const int *a2 )
{
    for( size_t i = 0 ; i < n ; i++)
        a1[i] = *a2++;
}

并称赞

init( right, N - N / 2, arr + N / 2 );

反过来函数print可以这样定义

void print( const int *a, size_t n )
{
    for( size_t i = 0 ; i < n ; i++)
    {
        printf("%d ", a[i]);
    }

    putchar( '\n' );
}

并称赞

print( right, N - N / 2 );

对于数组left,函数调用看起来像

init( left, N / 2, arr );

print( left, N / 2 );