0

对于我的作业,它被赋予一维数组,我必须将其转换为二维数组。二维数组的列数为 2,因为我必须将一维数组表示为对(数字的值,数组中出现的次数)。这是尝试过的。错误出现在代码的最后 2 行:访问冲突写入位置 0xfdfdfdfd。

#include <iostream>
#include <stdlib.h>
using namespace std;

int main()
{
    const int NR=17;
    int arr[NR]={6,7,3,1,3,2,4,4,7,5,1,1,5,6,6,4,5};
    int **newArr;
    int count=0;
    int countLines=0;
    int searched;
    for(int i=0;i<NR;i++)
    {
            newArr=new int*[countLines];
        for(int i=0;i<countLines;i++)
        {
            newArr[i]=new int[2];
        }
        searched=arr[i];
        if(i>0)
        {
            for(int k=0;k<countLines;k++)
            {
                if(newArr[countLines][0] == searched)
                {
                    searched=arr[i]++;
                }

                for(int j=0;j<NR;j++)
                {
                    if(searched==arr[j])
                    {
                        count++;
                    }
                }
                countLines++;
            }
        }
        else
        {
            for(int j=0;j<NR;j++)
            {
                if(searched==arr[j])
                {
                    count++;
                }
            }
            countLines++;
        }

        newArr[countLines][0]=searched;
        newArr[countLines][1]=count;
    }
}
4

2 回答 2

3

首先,您newArr在为其分配任何内存之前在第一个循环中使用。您不能取消引用不拥有合法内存的指针。它会导致未定义的行为。

其次,在最后一部分中,您分配newArr的内存等于countLines

newArr = new int*[countLines] ;

这意味着 的第一维中的索引newArr0------>countLines-1。做newArr[countLines][0] = searched ;又是未定义的。让它newArr[countLines - 1]

于 2012-11-17T13:37:04.023 回答
1

我不会为逐行代码分析而烦恼,因为(a)您在人们回答您的问题时更改它,并且(b)它确实需要太长时间。但这里有一个总结(非详尽的)klunkers:

  1. 您在从第二个开始的每个循环迭代中泄漏内存 (newArr)。
  2. 您多次超出阵列访问权限。
  3. 您根本不需要使用指针数组来解决这个问题。维度为 [N][2] 的单个数组,其中 N 是唯一值的数量。

您可以解决此问题的一种(无数种)方法如下所示:

#include <iostream>
#include <algorithm>

int main()
{
    // 0. Declare array and length
    int arr[]={6,7,3,1,3,2,4,4,7,5,1,1,5,6,6,4,5};
    const size_t NR = sizeof(arr)/sizeof(arr[0]);

    // 1. sort the input array
    std::sort(arr, arr+NR);

    /* alternaive sort. for this input size bubble-sort is
       more than adequate, in case your limited to not being
       allowed to use the standard library sort */
    /*
    for (size_t i=0;i<NR;++i)
        for (size_t j=i+1;j<NR;++j)
            if (arr[i] > arr[j])
            {
                arr[i] ^= arr[j];
                arr[j] ^= arr[i];
                arr[i] ^= arr[j];
            }
    */

    // 2. single scan to determine distinct values
    size_t unique = 1;
    for (size_t i=1;i<NR;++i)
        if (arr[i] != arr[i-1])
            unique++;

    // 3. Allocate a [unique][2] array
    int (*newArr)[2] = new int[unique][2];

    // 4. Walk array once more, accumulating counts
    size_t j=0;
    newArr[j][0] = arr[0];
    newArr[j][1] = 1;
    for (size_t i=1;i<NR;++i)
    {
        if (arr[i] != arr[i-1])
        {
            newArr[++j][0] = arr[i];
            newArr[j][1] = 0;
        }
        ++newArr[j][1];
    }

    // 5. Dump output
    for (size_t i=0;i<unique;++i)
        cout << newArr[i][0] << " : " << newArr[i][1] << endl;

    delete [] newArr;

    return EXIT_SUCCESS;
}

输出

1 : 3
2 : 1
3 : 2
4 : 3
5 : 3
6 : 3
7 : 2
于 2012-11-17T14:26:40.320 回答