pig*_*d10 2 c++ arrays pointers
我试图找到一个数组的大小,并且sizeof不能正常工作,因为我的数组是一个指针,而不是一个实际的数组(然后再次,我可能是错的).我是C++的新手,但不是编程.
这是我的功能:
int getSizeOfPointerArray(int a[]){
int n=0;
while(true){
if(!a[n]){
cout << "a[" << n << "] doesn't exist, breaking" << endl;
break;
}
cout << "a[" << n << "] exists with value " << a[n] << " at memory address " << &a[n] << endl;
n++;
}
return n;
}
Run Code Online (Sandbox Code Playgroud)
使用参数p调用该函数,其中p为:
p = new (nothrow) int[f];
Run Code Online (Sandbox Code Playgroud)
'f'是3.数组的元素是用以下方法收集的:
for(n=0;n<f;n++){
string c = ((n!=f-1)?", ":" ");
cout << p[n] << c;
}
Run Code Online (Sandbox Code Playgroud)
我期待看到输出中打印的三个元素的内存位置 - 每个四个分开 - 并且说a [4]不存在.相反,它打印了六个内存地址.前三个值是正确的(所有3个),但最后三个是-33686,-1414812757和另一个-1414812757.
为什么是这样?我可以将最终结果除以2,还是不一定是你指定的元素的两倍?这与非动态数组相同吗?
当你分配一个"数组"时new,你只是被给予一些当前没有被其他任何东西使用的任意内存位置.内存(及其周围环境)很可能充满随机垃圾,可能不是零.将已知的非零值写入p[0],p[1]并且p[2]不会影响生活在外面的垃圾p.
所以你的循环只是沿着内存走,直到它碰巧碰到零(我想在这种情况下发生),或者它击中了内存,它不允许访问,这将导致seg-fault.
正如其他人所说,如果您使用的是C++,则应该利用STL容器类. std::vector可能是直接阵列的最佳替代品.
C++代码无法访问动态分配的数组的大小,我建议使用std::vector.
如果数组是在堆栈上定义的(例如int arr[2];或int arr[] = { 1, 2, 3 })那么sizeof(arr)将是sizeof(int) * elements_in_arr(即使那时你应该更喜欢使用std::tr1::array).如果你想处理一个在编译时不知道大小的数组,那么101%的时间std::vector是要走的路(加或减2%).