arrays - 显示错误的 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;
}
解决方案
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 );