sortedArrayInsertNumber

sortedArrayInsertNumber

#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/

10-11 20:45