#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("%d\n", 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
从潜在的内存泄漏开始,因为首先分配了一个内存,然后使用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
可以使用标头
sortedArrayInsertNumber
中声明的标准C函数memcpy
代替函数<string.h>
中的循环。关于c - 运行时错误:insertatIndex,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44885697/