无法理解指针机制
Unable to understand the pointer mechanism
为什么下面的程序崩溃了?我尝试调试代码,但无法理解;我怀疑程序是错误的,或者传递给display
函数的指针的内存应该已经初始化。
#include <iostream>
using namespace std;
int display( int** intarray )
{
int size = 0;
while( size < 10 )
{
*intarray[size] = size;
size++;
}
return size;
}
int main() {
int* intptrarray;
int arraysize = 0;
arraysize = display( &intptrarray );
for ( int indx = 0; indx < arraysize; indx++ )
{
std::cout << intptrarray[indx] << std::endl;
}
return 0;
}
声明指针时,它不指向任何特定的内存地址。 要让它指向某个地方,您需要为其分配内存,如下所示:
#include <iostream>
using namespace std;
int display( int** intarray, int arraysize )
{
int size = 0;
while( size < arraysize )
{
(*intarray)[size] = size;
size++;
}
return size;
}
int main() {
int arraysize = 10;
int* intptrarray = new int[arraysize];
arraysize = display( &intptrarray, arraysize );
for ( int indx = 0; indx < arraysize; indx++ )
{
std::cout << intptrarray[indx] << std::endl;
}
delete[] intptrarray;
return 0;
}
每当你分配内存时,你需要记住自己释放它(删除单个变量,delete[]为数组(。
*intarray[size]
应该(*intarray)[size]
。
也尚未分配任何内存,因此在这两种情况下,您都通过写入未初始化的指针来导致未定义的行为。
编写此程序的正确方法是:
void display( std::vector<int> &vec )
{
vec.resize(10);
for ( int i = 0; i < 10; ++i )
vec[i] = i;
}
int main()
{
std::vector<int> vec;
display(vec);
for ( int indx = 0; indx < vec.size(); indx++ )
{
std::cout << vec[indx] << std::endl;
}
}
如果您有现代编译器,则可以通过使用基于std::iota
和基于范围的 for 循环来改进这一点。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 将派生的对象地址分配给基础指针和调用击路仪的机制
- 可视C++指针机制 - 错误 2440
- 无法理解指针机制
- C++ 状态模式实现:指向状态机的指针机制变得无效
- 用宏遮蔽void*指针的机制
- 指针解引用:编译器的实际机制
- 使C函数指针与C++中基于C样式堆栈的调用机制一起工作