malloc无法正常工作

时间:2017-12-28 17:08:28

标签: c++ malloc

所以,我从来没有在大学学过C ++指针,所以现在我自己做这个业余爱好。我作为学习练习的想法是开始将随机数(666)写入一系列记忆位置。事情是有些东西让我困惑(我两天前开始)。例如:

  1. 如果我不知道运行时需要多少内存,我为什么要使用malloc()?
  2. 为什么malloc()接受“1”的值但是我一直写到100万个地址没有问题?
  3. 为什么在输出上有一堆尚未“写入”的地址?
  4. 我知道这些都可能是愚蠢的新手问题,但请耐心等待。我正在尽最大努力自己学习。

    #include <iostream>
    
    using namespace std;
    
    int main() {
        int limit =0;
    
        int* x = (int*) malloc(sizeof(int) * 1);
    
        *x = 10;
    
        cout << "----------------------------------------------------" << endl;
    
        cout << "Incrementing memory address : " << endl;
    
    
    
    
        for(int j=0 ; j < 999 ; j++) {
            limit++;
            *x=666;
            x++;
        }
        x-= limit;  
        for(int j=0 ; j < ( limit ) ; j++) {
            cout << x << " " << *x << endl; 
            x++;
        }
        x-= limit;
        free(x);
    
    }
    

    输出

    ----------------------------------------------------
    Incrementing memory address : 
    0x55e11d8cae70 666
    0x55e11d8cae74 666
    0x55e11d8cae78 666
    0x55e11d8cae7c 666
    0x55e11d8cae80 666
    0x55e11d8cae84 666
    0x55e11d8cae88 666
    0x55e11d8cae8c 666
    0x55e11d8cae90 892696624
    0x55e11d8cae94 1680945509
    0x55e11d8cae98 1700881208
    0x55e11d8cae9c 824206137
    0x55e11d8caea0 808596530
    0x55e11d8caea4 808662326
    0x55e11d8caea8 2570
    0x55e11d8caeac 666
    0x55e11d8caeb0 666
    0x55e11d8caeb4 666
    0x55e11d8caeb8 666
    0x55e11d8caebc 666
    0x55e11d8caec0 666
    0x55e11d8caec4 666
    

    提前致谢!

    注意 - 我知道代码没有做任何有用的事情,我只是在玩C ++。

1 个答案:

答案 0 :(得分:4)

for(int j=0 ; j < 999 ; j++) {
        limit++;
        *x=666;
        x++; <---- yikes
    }

在这里,您将它递增以指向您没有分配的内存。在下一次迭代时调用未定义的行为取消引用它并向其写入内容。

*x=666之后的任何事情都处于未定义的行为范围内。

要回答你的问题,我会说malloc会做它应该做的事情。它分配内存 - 您请求的金额。 C在访问超出内存时不提供任何警告或异常。

您问为什么要使用malloc?你没有必要。您只需使用c++

执行此操作即可
std::vector<int> v;
for(int j=0 ; j < 999 ; j++) {
        limit++;
        v.push_back(666);
        /* other work */
    }

您已经知道的第三个问题答案 - 您已经增加了指针值,并且正在增加和打印。当您尝试访问它时 - 以及此代码出错的地方。

返回C

是的,你可以这样做 - 你可以根据需要分配。正如您现在分配的那样,轮到您仔细访问它了。您对malloc编译器使用C有点过时了。如果我不得不写一个C代码 - 我会写这样的

int* x = malloc(sizeof(int) * 1000);
if( x == NULL ){
  perror("Malloc failed");
  exit(1);
}
for(size i=0; i<1000; i++){
   x[i] = 666;
}

当您分配1000整数时 - 是的,它会正常工作。而不是递增x,你可以这样做。按照简单的方法没有坏处。

如果您想使用1000初始化666元素,可以在C++

中执行此操作
std::vector<int> v(1000,666);