我创建了一个包含3个不同功能的共享库。 在funcA函数内部,有一个局部变量,一个大小为10的数组。 funcA调用funcB并传递arr1的基址和元素的no。
funcB调用funcC并传递arr2的基址(arr1的间接基址)和no元素。
在funcC里面我正在访问数组的所有元素。 我正在路过 参数作为参考,所以每当我访问里面的数组元素 funcC,它将间接访问ORIGINAL数组的内存地址,arr1。
如何在funcA之外找到arr1的内存地址(可能在其他线程或program2中)。我知道 一旦我将退出funcA,分配给arr1的地址无效。
我想检查是否访问arr1的内存地址 执行funcC,我该怎么做?
我无法将arr1定义为extern或static。
这是我的计划
#include<stdio.h>
funcA()
{
int *arr1=malloc(10*sizeof(int));
int n;
for(n=0;n<10;n++)
arr1[n]=n+1;
for(n=0;n<15;n++)
{
funcB(arr1,10);
}
}
funcB(int *arr2,int n)
{
funcC(arr2,n);
}
funcC(int *arr3,int n)
{
int i=0;
for(i=0;i<n;i++)
*(arr3+i)*=2; // Accessing local array element of funcA
}
main()
{
funcA();
}
首先,我尝试从C生成程序集。我得到了存储在堆栈中的数组的关系,可以访问ebp(不知道如何从c程序访问特定地址,如[ebp-40] ?)。
然后我使用gdb查找funcA和arr1的地址,但是无法理解如何确认我正在获取arr1的正确地址?
我在ubuntu12.04下使用gcc。任何帮助理解或任何链接将受到高度赞赏。提前谢谢。
答案 0 :(得分:1)
只有当声明它的函数在call stack上有一个活动帧时(并且在技术上,当声明本地处于活动状态的块时),本地变量才存在。
请注意,对于递归函数,您将获得多个局部变量(每个调用帧一个)。此外,如果多个线程具有用于声明该变量的相同功能的活动帧,则每个活动调用帧具有本地变量的这样的地址。最后,编译器会优化一些变量,并且可能不会对其中的某些变量使用任何堆栈槽(例如,将该变量放入寄存器中;阅读register allocation)。
所以你找不到局部变量的地址,因为那个局部变量可能不存在 - 它的函数没有活动的调用帧 - 或者存在多个 - recursion的几个活动调用帧 - 。
所以你的问题毫无意义!
当然,您可以在函数中存储一些代码,声明本地 - 局部变量的地址(例如,在全局,堆中某些记录的字段中等等)。当你从声明它的块中退出(或返回)时,该地址将变为无效。使用或取消引用此类无效地址为undefined behavior。
答案 1 :(得分:-1)
打印指针的地址它将是相同的,这意味着所有指针都指向同一个内存位置。
funcA()
{
int arr1[10];
int n;
for(n=0;n<10;n++)
arr1[n]=n+1;
printf("%p\n",arr1);
funcB(arr1,10);
}
funcB(int *arr2,int n)
{
printf("%p\n",arr2);
funcC(arr2,n);
}
funcC(int *arr3,int n)
{
int i=0;
printf("%p\n",arr3);
for(i=0;i<n;i++)
printf("%d \n",*(arr3+i));
}