首页 > 解决方案 > 显示错误的 C 代码:*** 检测到堆栈粉碎 ***:终止中止(核心转储)

问题描述

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

标签: arrayscfor-loopfunction-definitionstack-smash

解决方案


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

推荐阅读