c++ - 最多只能打印数组的条目两次

标签 c++ arrays crash cout

<分区>

当我从命令行运行包含具有以下代码的函数的可执行文件时,result[1] 仅在程序崩溃前打印两次(“*.exe 已停止工作”),即使blocklength 设置为 25。

当我双击运行完全相同的可执行文件时,程序崩溃而没有打印任何内容。 (但它一直运行到 for 循环之前)

result 是一个 double 类型和长度为 blocklength 的数组,它作为参数传递给函数。

for (int i = 0; i < blocklength; i++) {
    cout << result[1] << endl;
}

当我使用 GNU 项目调试器 (GDB) 逐步检查程序时,它打印了 result[1] 25 次并且没有崩溃。

显然,原始的 for 循环不仅仅是一遍又一遍地打印相同的值,但我将问题缩小到这一点,现在完全陷入困境和困惑。

如果有任何帮助或意见,我将不胜感激。

这是完整的代码,result 在主函数中定义为 double* result = new double[blocklength] 并立即传递给函数:

void entropy(char* input, int l_input, double* result, int blocklength, char order)
{
    int l_counter = pow(order, blocklength);
    int* counter = new int[l_counter];
    double prob = 0;
    int max_counter = 1;
    int* temp = new int[l_input];

    for (int i = 0; i < l_input; i++) {
        temp[i] = 0;
    }

    for (int s = 1; s <= blocklength; s++)
    {
        max_counter *= order;

        // reset counter
        for (int i = 0; i < max_counter; i++) {
            counter[i] = 0;
        }

        // init result
        result[s] = 0;


        for (int b = 0; b < l_input + 1 - s; b++) {
            temp[b] = order * temp[b] + input[b - 1 + s];
            counter[temp[b]]++;
        }

        for (int b = 0; b < max_counter; b++) {
            prob =  counter[b] / (double)(l_input - s + 1);
            if (prob != 0)
            {
                result[s - 1] = result[s - 1] + fabs(prob * log(prob));
            }
        }

        std::cout << "Block " << s << " okay" << std::endl;
    }

    cout << "sum done" << endl;

    for (int i = 0; i < blocklength; i++)
    {
        cout << result[1] << endl;
    }

    std::cout << "Entroyp done!" << std::endl;
}

最佳答案

您的代码有两处似乎有问题。 result[s] 初始化后未读/写。

result[s] = 0; 

取而代之的是访问 result[s-1]。

result[s - 1] = result[s - 1] + fabs(prob * log(prob));

这意味着 result[0] 永远不会被设置为 0。这也意味着 result[blocklength] = 0 将被分配但永远不会被使用。

如果您的代码中有类似 int* result = new int[blocklength]; 的行,那么您访问的值根本不在您的数组中。有效索引介于 0 和 arrayLenght-1 之间。

或者更一般的: 如果您的输入错误,您的程序就会崩溃。您必须确保没有访问超出数组容量的值,这应该在访问它的行/循环中完成,而不是在其他地方。

在这种情况下,您必须确保结果容量至少为 blocklength+1。

关于c++ - 最多只能打印数组的条目两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32297326/

相关文章:

c++ - 使用异步 C++ 进行 vector 的并行乘法

python - 替换结构化 Numpy 数组的字段

Javascript - 检查传入对象的嵌入数组值

iphone - 我的应用程序在我的 Iphone 上启动时崩溃

iphone - iPad 崩溃以及可能相关的内存问题

c++ - 指针、字符串和溢出错误

c++ - 将父类转换为子类以避免冗余

c++ - 为什么我的程序不输出 i?

C++ 数组编号从大到小

arrays - 释放数组会使xCode中的应用程序崩溃