【发布时间】:2012-01-18 12:16:24
【问题描述】:
我很困惑是否有效(在 C 中)将指针传递给已按如下方式启动的数组(例如,在堆栈上的编译时):
int a[] = {1, 2, 3};
my_func(&a);
void my_func(int **a)
{
int *tmp = *a; /* this statement fixes the problem */
printf("%d %d %d", (*a)[0], (*a)[1], (*a)[2]); /*doesn't work */
printf("%d %d %d", tmp[0], tmp[1], tmp[2]); /*does work */
}
当我使用 gdb 逐步执行此操作时,我无法从“内部”my_func 中“看到”任何值 (*a)[0] 等。例如
(gdb) p (*a)[0]
Cannot access memory at address 0x0
我在想我可能对堆栈而不是堆上的数组可以做什么和不能做什么有根本的误解?
我希望不是这样,因为我的单元测试可以很方便地在堆栈上声明数组,如示例中所示,但我需要测试期望指向 int 指针的函数。
请注意,我确实收到如下编译器警告:
test_utility.c:499:5: warning: passing argument 1 of ‘int_array_unique’ from incompatible pointer type [enabled by default]
../src/glamdring2.h:152:5: note: expected ‘int **’ but argument is of type ‘int (*)[12]’
但我认为可以将 int *a[] 与 **a 混合使用?也许不是?它们不相等吗?
【问题讨论】:
-
如果你想将指针存储在堆栈上,你可以在存储它之前将它转换,并在你想使用它时再次转换它:
ptr_int = (int)ptr用于存储ptr_int和ptr = (int*)ptr_int用于用法。但我不确定这是否足以解决您的问题。 -
传递对数组指针的引用是否有特殊原因?
-
@kenneth 是的 - 我将参数用作输入和返回值。
-
我有一个修复,需要在 my_func 中进行适当的转换,int *tmp_a = *a;一切都开始工作了。
-
基本上,正如 wildplasser 所指出的,我从右值中不知道我的左值。希望通过一些背景阅读来纠正这一点
标签: arrays c pointers heap-memory stack-memory