为啥不能成功分配数组?

Posted

技术标签:

【中文标题】为啥不能成功分配数组?【英文标题】:Why cant the array be allocated successfully?为什么不能成功分配数组? 【发布时间】:2018-08-16 09:56:41 【问题描述】:

这是我的代码:

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

int find_cross(char*, int, int, int);
void reduction(char*, char*, int, int);

int main()
    int n;
    int m;
    cin >> n >> m;
    char *data = new char[n * m];
    for(int i = 0; i < n; i++)
        cin >> (data+i*m);
    
    cout << "pass one" << endl;
    char *original = new char[n * m];
    cout << "pass two" << endl;
    for(int i = 0; i < n * m; i++)
        *(original+i) = *(data+i);
    
    int biggest_size;
    if(n >= m)
        if(m % 2 == 0)
            biggest_size = m - 1;
        else
            biggest_size = m;
        
    else
        if(n % 2 == 0)
            biggest_size = n - 1;
        else
            biggest_size = n;
        
    
    
        int biggest = 0;
        for(int i = 1; i < biggest_size + 1; i = i + 2)
            reduction(data, original, n, m);
            if(find_cross(data, i, n, m))
                for(int j = biggest_size; j >= 1; j = j - 2)
                    if(find_cross(data, j, n, m))
                        if((i * 2 - 1) * (j * 2 - 1) > biggest)
                            biggest = (i * 2 - 1) * (j * 2 - 1);
                        
                        break;
                    
                
            
        
        cout << biggest;
    
    delete [] data;
    delete [] original;
    system("pause");
    return 0;


int find_cross(char* data, int size, int row, int column)
    for(int i = (size - 1) / 2; i < row - (size - 1) / 2; i++)
        for(int j = (size - 1) / 2; j < column - (size - 1) / 2; j++)
            int yes = 1;
            for(int k = 0; k < (size - 1) / 2 + 1; k++)
                if(*(data+(i+k)*column+j) != 'G' || *(data+(i-k)*column+j) != 'G' || *(data+i*column+j+k) != 'G' || *(data+i*column+j-k) != 'G')
                    yes = 0;
                    break;
                
            
            if(yes == 1)
                for(int k = 0; k < (size - 1) / 2 + 1; k++)
                    *(data+(i-k)*column+j) = 'A';
                    *(data+(i+k)*column+j) = 'A';
                    *(data+i*column+j+k) = 'A';
                    *(data+i*column+j-k) = 'A';
                
                return 1;
            else if(i == row - (size - 1) / 2 - 1 && j == column - (size - 1) / 2 - 1)
                return 0;
            
        
    
    return -1;


void reduction(char* data, char* original, int row, int column)
    for(int i = 0; i < row; i++)
        for(int j = 0; j < column; j++)
            *(data+i*column+j) = *(original+i*column+j);
        
    

这是我的输入:

14 12
GGGGGGGGGGGG
GGGGGGGGGGGG
BGBGGGBGBGBG
BGBGGGBGBGBG
GGGGGGGGGGGG
GGGGGGGGGGGG
GGGGGGGGGGGG
GGGGGGGGGGGG
BGBGGGBGBGBG
BGBGGGBGBGBG
BGBGGGBGBGBG
BGBGGGBGBGBG
GGGGGGGGGGGG
GGGGGGGGGGGG

执行结果:

14 12
GGGGGGGGGGGG
GGGGGGGGGGGG
BGBGGGBGBGBG
BGBGGGBGBGBG
GGGGGGGGGGGG
GGGGGGGGGGGG
GGGGGGGGGGGG
GGGGGGGGGGGG
BGBGGGBGBGBG
BGBGGGBGBGBG
BGBGGGBGBGBG
BGBGGGBGBGBG
GGGGGGGGGGGG
GGGGGGGGGGGG
pass one

--------------------------------
Process exited after 256.8 seconds with return value 3221226356

问题出现在char *original = new char[n * m];,无法成功执行,程序crash。但是有一个奇怪的事情发生了,数组char *data = new char[n * m];可以分配成功。发生了什么,以及如何解决这个问题? Original picture

【问题讨论】:

我没有仔细检查你的代码,但很可能你访问的范围超出了数组的范围。尝试使用vector 代替new char,并使用at(x) 代替[x]。并捕获异常 我不知道为什么它是粉碎。并且 return 不是 0。 发生了什么“问题...”?如果你不解释清楚,我们怎么知道“发生了什么”? 您正在写超过 data 的结尾,这是未定义的。 指针算法太复杂了,任何人都无法说“这确实是正确的”。编写一个指数计算函数并使用它。 【参考方案1】:

您忘记了读取字符串时添加的 nul 终止符。您的第二次分配失败,因为您通过越界写入损坏了堆。您的数组中还需要一个字节

char *data = new char[n * m + 1];

或者您可以做一些明智的事情并将其视为吸取的教训并使用字符串向量。

vector<string> data(n);
for(int i = 0; i < n; i++)
    cin >> data[i];

vector<string> original = data;

看看您的代码变得多么清晰和简单?

【讨论】:

你能告诉我为什么程序在cout &lt;&lt; "pass one";之后崩溃,我很困惑。 因为你写的超出了数组的范围, @WhozCraig 我数了 12 @WhozCraig OP 对 nul 终止符不感兴趣。每个 nul 终止符都会被下一次读取覆盖。当然,最后一个除外,这就是问题所在 @000 正如我一直说的,你写的东西超出了数组的范围。你有什么不明白的?哪里出了问题?

以上是关于为啥不能成功分配数组?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能将从 Firestore 获取的值分配给 Swift 中的数组?

C语言中,数组名作为函数参数,属于啥传递,为啥?

为啥指向 char 数组的指针必须需要 strcpy 才能为其数组分配字符而双引号分配不起作用?

c语言中,为啥不能对字符指针变量指向的字符串再赋值?

调用方法并将返回值分配给数组时,为啥C#在调用方法时使用数组引用?

为啥数组分配后堆这么大