【问题标题】:C code showing the error : *** stack smashing detected ***: <unknown> terminated Aborted (core dumped) [closed]显示错误的 C 代码:***检测到堆栈粉碎***:<未知>终止中止(核心转储)[关闭]
【发布时间】:2021-10-10 17:24:36
【问题描述】:

我有一个 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;
}

【问题讨论】:

  • 不错。为N 选择一个奇数值,然后在任何地方使用N/2

标签: arrays c for-loop function-definition stack-smash


【解决方案1】:

您声明了一个 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 );

【讨论】:

  • 啊,好吧,那么解决办法是什么,我应该设置一个条件来检查 array.length 是奇数还是偶数,然后找到正确的开始和结束?
  • @bwass31 查看我更新的帖子。
  • int right[N - N / 2]; // 这太聪明了,非常好!请你解释一下这个块:void init( int *a1, size_t n, const int *a2 ) { for( size_t i = 0 ; i &lt; n ; i++) a1[i] = *a2++; }
  • @bwass31 for 循环等价于 for ( size_t i = 0; i
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-16
  • 2021-08-26
  • 1970-01-01
  • 2021-07-18
相关资源
最近更新 更多