C ++,exe在执行期间已停止工作

时间:2015-02-21 15:00:36

标签: c++

我做了一个小程序,它使用合并排序算法合并两个数组,但令人惊讶的是它在执行时停止工作......它没有任何编译错误。

#include<iostream> 
#include<array> 

using namespace std;

int main()

{
    // below are declarations of two single dimensional arrays and two variables

    int n1,n2,t1,t2,t3;
    int l1 [5] = {2,1,4,3,5};
    int l2 [5] = {8,6,7,9,10};
    int l3 [10];

    n1 = l1[4] - l1[0] +1;
    n2 = l2[4] - l2[0] +1;   


   //below are the declaration and initialization of two pointers

     t1 = l1[0];
     t2 = l2[0];
     t3 = l3[0];


      while((n1>0) && (n2>0) )

     {

         if (l1[t1] < l2[t2])
         {

             l3[t3] = l1[t1]; 
             t1++;
             t3++;

             n1--;
             cout<<l3[t3]<<endl;

          }
          else
            l3[t3] = l2[t2];
          t2++;
          t3++;
          n2--;

     } 

 }

我仍然没有决定程序的输出

1 个答案:

答案 0 :(得分:1)

你对指针非常困惑。这样:

n1 = l1[4] - l1[0] + 1;

获取l1[4],减去l1[0],然后添加1。您似乎认为l1[4] - l1[0]将为您提供数组中元素的数量,而不是1。你真正想要的是:

n1 = sizeof l1 / sizeof l1[0];

同样,这:

t1 = l1[0];

没有制作&#34;指针&#34; - t1只是一个int,其中包含l1[0],而不是它的地址。正如评论中指出的那样,即使它是一个指针,你也无法将它用作索引。你真正想要的是:

t1 = 0;

最后,这个:

while( (n1 > 0) && (n2 > 0) )
只有你的一个数组才会停止

。你想要的是:

while( (n1 > 0) || (n2 > 0) )

虽然如果l1包含任何高于l2的元素,这将会中断。

这是您的程序的修改版本,它实现了您的算法:

#include <iostream>

int main()
{
    int l1[5] = {2, 1, 4, 3, 5};
    int l2[5] = {8, 6, 7, 9, 10};
    int l3[10] = {0};

    int n1 = sizeof l1 / sizeof l1[0];
    int n2 = sizeof l2 / sizeof l2[0];
    int t1 = 0, t2 = 0, t3 = 0;

    while ( (n1 > 0) || (n2 > 0) ) {
        if ( l1[t1] < l2[t2] ) {
            l3[t3++] = l1[t1++];
            --n1;
        }
        else {
            l3[t3++] = l2[t2++];
            --n2;
        }
    }

    for ( int i = 0; i < sizeof l3 / sizeof l3[0]; ++i ) {
        std::cout << l3[i] << std::endl;
    }

    return 0;
}

带输出:

paul@horus:~/src/sandbox$ ./ms
2
1
4
3
5
8
6
7
9
10
paul@horus:~/src/sandbox$ 

显然,正如实现的那样,你的算法会合并两个列表,但是如果它们最初没有排序,那么你不会最终得到一个排序列表。如果您确实想要以排序列表结束,那么您还有更多工作要做。此外,如上所述,对于大多数阵列,您的算法通常无法正常工作。