这个指针和内存代码打印的是啥?我不知道它是在打印垃圾还是如何打印我需要的值

Posted

技术标签:

【中文标题】这个指针和内存代码打印的是啥?我不知道它是在打印垃圾还是如何打印我需要的值【英文标题】:What is this pointer and memory code printing? I don't know if it's printing garbage or how to print the value that I need这个指针和内存代码打印的是什么?我不知道它是在打印垃圾还是如何打印我需要的值 【发布时间】:2020-07-14 03:28:28 【问题描述】:

这是我从一个更大的代码中提取的一个 sn-p 代码。我需要弄清楚我正在打印的内容是否是垃圾以及如何更改它以打印我需要的值。 我需要它来打印int id 的值,而不是打印它的任何值。在这次运行中,输出是10813776,当然,每当我更改一些代码或重新启动 DevC++ 时,它都会发生变化。

代码是:

#include <iostream>
#include <memory> //Memory allocation (malloc)

using namespace std;

int main()
    int id = 0;
    int nMemory = 0;
    int * pMemory;
    pMemory = (int *) malloc(20 * sizeof(int));
    
    while(id < 20)
        if (pMemory != NULL)
            cout << "Numbers in memory: " << endl;
            pMemory = new int[id];
            nMemory = *pMemory;
            cout << nMemory << endl;
        
        id++;
    
    delete pMemory;
    
    return 0;

【问题讨论】:

不要在 C++ 中使用malloc()。使用运算符new 我对 C++ 还很陌生。我知道我只需要 20 个整数,所以这就是我使用它的原因。使用new 有什么好处吗?我将如何实现它? new int[id]malloc(sizeof(int) * id) 半“等效” 我对 C++ 还很陌生 -- 如果是这种情况,您是从哪里想到在 C++ 程序中使用 malloc 的?我所知道的任何 C++ 书籍都没有显示这一点。使用malloc 分配内存并使用delete 释放内存是未定义的行为。 Tour 不错,但最好用作复习。分配存储时的优先顺序应该是 Automatic,library container,smart pointer,newmalloc。大约只有一次你应该退出 malloc 是真正的低级脚手架。 【参考方案1】:
pMemory = new int[id];
nMemory = *pMemory;

第一行将您malloc-ed 的数组替换为一个新的未初始化数组,然后尝试从该新数组的第一个槽中读取。你不应该直接分配给pMemory;可能是 pMemory[someIndex],但不是 pMemory 本身。

您是否尝试从pMemory 数组中读取并将其分配给nMemory?如果是这样,请将上面的行更改为:

nMemory = pMemory[id];

你的整个循环应该看起来更像这样:

if (pMemory != NULL) 
    cout << "Numbers in memory: " << endl;
    while(id < 20) 
        nMemory = pMemory[id];
        cout << nMemory << endl;
        id++;
    

或者,使用更惯用的 for 循环:

if (pMemory != NULL) 
    cout << "Numbers in memory: " << endl;
    for (int i = 0; i < 20; i++) 
        cout << pMemory[i] << endl;
    

(您还必须在此循环上方的某处初始化数组。我假设您在实际代码中这样做,但如果不是:您发布的代码使用 malloc() 分配了一个数组,但没有设置项目为有用的值。确保在尝试阅读和打印它们之前将它们设置为有意义的值。)

【讨论】:

我的代码使用文本文件中的整数并将它们写入内存,但它仍然会打印出垃圾。老实说,我不知道到底哪里出了问题。 @DanielPantigoso 您显示的代码中没有任何内容可以用任何数据填充分配的内存,更不用说来自文件了。请更新您的问题以显示minimal reproducible example 演示您的真实代码。【参考方案2】:

此代码泄漏了您使用malloc()new[] 分配的内存块。

malloc() 一块内存并将其地址分配给pMemory,然后您将pMemory 更改为指向使用new[] 分配的不同内存地址。所以你失去了free()malloc()'ed 内存的能力(你甚至没有尝试调用free())。

而且,这段代码没有正确释放new[] 分配的内存。使用new[] 分配的内存必须使用delete[] 释放,而不是使用delete。更糟糕的是,您在一个循环中调用了 20 次 new[],但在循环之后只调用了一次 delete。因此,您正在泄漏 19 块 new[]ed 内存,并且未定义的行为释放了 1 块。

现在,为了回答您的实际问题,代码打印出垃圾,因为您使用 new[] 分配的内存未初始化,因此您尝试从该内存打印的数据包含 不确定值。

【讨论】:

以上是关于这个指针和内存代码打印的是啥?我不知道它是在打印垃圾还是如何打印我需要的值的主要内容,如果未能解决你的问题,请参考以下文章

C指针1

谁能告诉这个问题打印的是啥?

从尾到头打印链表

我在医院扫的口腔3D图,拷给我都这些文件名,3DSlice342.dcm 是啥格式打不开???

这段代码是如何工作的,很短的方法来反转一个字符串,它工作,但我不知道如何

指针的null是啥意思