Malloc无法正常工作



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

  1. 如果我不知道在运行时需要多少记忆需要多少记忆?
  2. ,为什么要使用malloc()?
  3. 为什么Malloc()接受" 1"的价值,但然后我一直写作直到100千毫无问题的地址?
  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 。

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

在这里,您将其递增,以指向您没有分配的某些内存。当您在下一个迭代中解除它并为其写入某些内容时,请调用不确定的行为。

*x=666之后的任何事物都处于未定义行为领域。

要回答您的问题,我想说malloc做应该做的事情。它分配内存 - 您要求的金额。C在访问BOND内存时不提供任何警告或例外。

您问为什么要使用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 ints时 - 是的,它可以正常工作。而不是增加x,您可以简单地这样做。简单的方法没有伤害。


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

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

相关内容

  • 没有找到相关文章

最新更新