2017-07-03 12 views
0
#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]); 
    } 
} 

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

2 
4 
6 
8 
10 
12 

哪个没有意义?

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

这个问题要求我在相应的索引处插入一个值num

+0

你正在泄漏内存分配出来,并用'sortedArrayInsertNumber'返回的内存覆盖它的值。 – LPs

+0

'Arr [len]'将访问数组越界'Arr [5]'。在你的情况下,索引从'0'开始到'4'。 – LPs

+0

@LP即使当我仅仅使用 'int * out; out = sortedArrayInputNumber(Arr,5,12); ' 同样的问题仍然存在(注意:它仅在有时会给我提供运行时错误,而其他时候它给了我上面提到的正确答案)。我在具有长度len + 1的sortedArrayInsertNumber函数中返回一个全新的数组“输出”。 –

回答

1

在函数insertAt中,至少有两次尝试访问阵列之外的内存。第一个是在语句

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

,第二个是在语句

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

当变量i等于0

功能sortedArrayInsertNumber开始与潜在存储器当变量len至少等于0时泄漏,因为首先分配内存,然后用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类型。

若要多次调用功能sortedArrayInsertNumber中的函数insertAt没有任何意义并打破循环。

在主那里了内存泄漏

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的循环,你可以使用头<string.h>申报标准的C函数memcpy

+0

谢谢你回答我的问题。 但是,我只访问一个非法内存(您指出的第一个)。在第二种情况下,如果num <= Arr [0],程序在for循环中到达第三个条件之前将返回0,不是吗? 我应该在检查'len <= 0'以避免潜在的内存泄漏之后声明输出数组吗? –

+0

另外,如果我刚刚使用了 'int * out; out = sortedArrayInsertNumber(input,5,12); ' 另外,还有什么我可以做,以提高我的代码?如果我只被允许使用一个for循环来解决这个问题呢? –

+0

@ ritika_13我在答案中展示了如何定义函数。调查他们。 –