gpt4 book ai didi

c++ - malloc 没有像我预期的那样工作

转载 作者:搜寻专家 更新时间:2023-10-31 00:53:39 25 4
gpt4 key购买 nike

所以,我在大学里从未学过 C++ 指针,所以现在我把它作为一种业余爱好。作为学习练习,我的想法是开始将随机数 (666) 写入一系列内存位置。事情是有些东西让我感到困惑(我两天前开始)。例如:

  1. 如果我直到运行时才知道我需要多少内存,为什么要使用 malloc()?
  2. 为什么 malloc() 接受了“1”的值,但我一直写到 10 万个地址都没有问题?
  3. 为什么输出结果中有一堆地址没有被“写入”?

我知道这些可能都是愚蠢的新手问题,但请多多包涵。我正在尽最大努力自学。

#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 不会在访问超出限制的内存时提供任何警告或异常。

你问为什么要使用malloc?你不必。您可以使用 c++

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

第三个问题回答你已经知道 - 你已经增加了指针值并且正在增加和打印。当您尝试访问它时 - 这就是这段代码出错的地方。

回到C:

是的,您可以这样做 - 您可以根据需要分配多少。正如您分配的那样,现在轮到您仔细访问它了。您对 C 编译器使用 malloc 有点不对劲。如果我必须从中编写 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 你可以简单地这样做。遵循简单的方法没有坏处。


如果您想用 666 初始化 1000 元素,您可以在 C++ 中执行此操作

std::vector<int> v(1000,666);

关于c++ - malloc 没有像我预期的那样工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48011508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com