我想:
我的方法声明有func(int ** arr_address),我把这个方法称为func(& arr)。实现此目的的一种方法是在我的方法中分配局部变量,但这看起来很笨拙。我试图使用的方法是直接访问数组元素,如* arr_address [1],但这似乎将[1]偏移应用于指针的内存地址,而不是数组数据开始的地址在记忆中。
这是一个带有输出的简单程序,用于说明两种不同的方法:
#include <iostream>
#include <stdlib.h>
void func(int** arr1_address, int** arr2_address)
{
int* arr1_local = *arr1_address;
arr1_local[1]=2; // Works
*arr2_address[1]=22; // (*) Writes to position 0 of wrong array!
// These realloc() calls were incorrect in the original question
//arr1_address = (int**)realloc(*arr1_address, 3*sizeof(int));
//arr2_address = (int**)realloc(*arr2_address, 3*sizeof(int));
*arr1_address = realloc(*arr1_address, 3*sizeof(int));
*arr2_address = realloc(*arr2_address, 3*sizeof(int));
//arr1_local[2] = 3;
//*arr2_address[2] = 33;
}
int main()
{
int* arr1;
int* arr2;
arr1 = (int*)calloc( 2, sizeof(int) );
arr2 = (int*)calloc( 2, sizeof(int) );
arr1[0] = 1;
arr2[0] = 11;
std::cout << "arr1, before func(): " << &arr1 << std::endl;
std::cout << "arr2, before func(): " << &arr2 << std::endl;
func(&arr1, &arr2);
std::cout << "arr1, after func(): " << &arr1 << std::endl;
std::cout << "arr2, after func(): " << &arr2 << std::endl;
std::cout << "" << std::endl;
std::cout << "arr1: " << std::endl;
std::cout << arr1[0] << std::endl;
std::cout << arr1[1] << std::endl;
std::cout << arr1[2] << std::endl;
std::cout << "" << std::endl;
std::cout << "arr2:" << std::endl;
std::cout << arr2[0] << std::endl;
std::cout << arr2[1] << std::endl;
std::cout << arr2[2] << std::endl;
return 0;
}
输出如下:
arr1, before func(): 0xffffcc08 // Note offset after arr2 location in memory
arr2, before func(): 0xffffcc00
arr1, after func(): 0xffffcc08 // realloc did not move the arrays
arr2, after func(): 0xffffcc00
arr1:
22 // Note line marked (*) wrote here instead of arr2[1]
2
66594
arr2:
11
0
66554
我很确定我明白为什么标有(*)的行会按照它的方式工作。我想知道是否有类似的方法直接从其地址处理arr2的[1]元素。
(道歉,如果之前有人问过这个问题,我已经阅读了不少答案,并在询问之前尽力调查。)
编辑:更好的标题,修复realloc()行中的错误
答案 0 :(得分:4)
我想知道是否有类似的方法直接从其地址处理
[1]
的{{1}}元素。
当arr2
应用于[]
时,您看到行为的原因是arr2_address
的优先级高于[]
。您可以通过应用括号来强制执行所需的优先级:
*
答案 1 :(得分:1)
你的问题是不明白什么指针指向指针到指针结构中的数据。如果您有多个指针级别,请停止并volumes。
通常你几乎不应该使用指针指针。这种情况也不例外。你想通过引用传递。使用实际参考。
void func(int*& arr1, int*& arr2)
{
arr1[0] = 42; // simple, easy
arr1 = realloc (arr1, 42*sizeof(int)); // simple, easy
free (arr2); // simple, easy
arr2 = malloc (42*sizeof(int)); // simple, easy
}