所以,我从来没有在大学学过C ++指针,所以现在我自己做这个业余爱好。我作为学习练习的想法是开始将随机数(666)写入一系列记忆位置。事情是有些东西让我困惑(我两天前开始)。例如:
我知道这些都可能是愚蠢的新手问题,但请耐心等待。我正在尽最大努力自己学习。
#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 ++。
答案 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);