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