C语言 运行时错误:插入索引


#include <stdio.h>
#include <malloc.h>
int insertAt(int *Arr, int len, int num) {
for (int i = 0; i < len; ++i) {
if (num <= Arr[0])
return 0;
else if (num >= Arr[len])
return len + 1;
else if (num >= Arr[i - 1] && num <= Arr[i])
return i;
}
}
int * sortedArrayInsertNumber(int *Arr, int len, int num){
int *output = (int *)malloc((len + 1)*sizeof(int));
if (len <= 0)
return NULL;
for (int i = 0, j = 0; j <= len+1; ++i, ++j) {
if (i == insertAt(Arr, len, num) && j==i) {
output[j] = num;
--i;
}
else if(insertAt(Arr,len,num)==len+1) {
output[j] = num;
}
else {
output[j] = Arr[i];
}
}
return output;
}
int main() {
int input[5] = {2,4,6,8,10};
int *out = (int*)malloc(6*sizeof(int));
out = sortedArrayInsertNumber(input, 5, 12);
for(int i=0;i<6;++i) {
printf("%dn", out[i]);
}
}

当我尝试这个测试用例时,它有时会给我一个运行时错误。其他时候,它输出:

2
4
6
8
10
12

这没有意义?

另外,有没有办法让我的代码更好?

这个问题要求我插入一个值num在其适当的索引处。

在函数insertAt中,至少有两次尝试访问数组之外的内存。第一个在声明中

else if (num >= Arr[len])
^^^^

第二个在声明中

else if (num >= Arr[i - 1] && num <= Arr[i])
^^^^^^

当变量i等于 0 时。

当变量 len 至少等于 0 时,函数sortedArrayInsertNumber以潜在的内存泄漏开始,因为首先分配了内存,然后使用 A NULL 指针退出函数。

int * sortedArrayInsertNumber(int *Arr, int len, int num){
int *output = (int *)malloc((len + 1)*sizeof(int));
if (len <= 0)
return NULL;
// ...

当数组的长度具有类型int而不是类型size_t时,这也是一个坏主意。

多次调用函数insertAt函数sortedArrayInsertNumber没有意义并中断循环。

总的来说,再次出现内存泄漏

int *out = (int*)malloc(6*sizeof(int));
out = sortedArrayInsertNumber(input, 5, 12);

该程序可以如下所示。

#include <stdio.h>
#include<stdlib.h>
size_t insertAt( const int *a, size_t n, int num ) 
{
size_t i = 0;
while ( i < n && !( num < a[i] ) ) i++;
return i;
}
int * sortedArrayInsertNumber( const int *a, size_t n, int num )
{
int *b = malloc( ( n + 1 ) * sizeof( int ) );
if ( b )
{
size_t pos = insertAt( a, n, num );
size_t i = 0;
for ( ; i < pos; i++ ) b[i] = a[i];
b[i] = num;
for ( ; i < n; i++ ) b[i+1] = a[i];
}
return b;
}
int main(void) 
{
int input[] = { 2, 4, 6, 8, 10 };
const size_t N = sizeof( input ) / sizeof( *input );
int *out = sortedArrayInsertNumber( input, N, 12 );
if ( out )
{
for ( size_t i = 0; i < N + 1; i++ )
{
printf( "%d ", out[i] );
}
putchar( 'n' );
}
free( out );
return 0;
}

它的输出是

2 4 6 8 10 12

您可以使用在标头<string.h>中声明的标准 C 函数memcpy代替函数sortedArrayInsertNumber中的循环。

最新更新