[英]Finding address of local variable defined inside shared library function
我創建了一個包含3個不同功能的共享庫。 在funcA函數內部,有一個局部變量,大小為10的數組。funcA調用funcB並傳遞arr1的基地址,而沒有元素。
funcB調用funcC並傳遞arr2的基地址(間接地為arr1的基地址)和元素編號。
在funcC內部,我正在訪問array的所有元素。 當我傳遞參數作為引用時,因此每當我訪問funcC內的數組元素時,它將間接訪問原始數組arr1的內存地址。
我如何在funcA之外找到arr1的內存地址(可能在其他線程或program2中)。 我知道一旦退出funcA,分配給arr1的地址將無效。
我想檢查在執行funcC時是否訪問了arr1的內存地址,該怎么辦?
我無法將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。 任何幫助理解或任何鏈接將不勝感激。 提前致謝。
僅當在其中聲明了局部變量的函數在調用堆棧上具有活動框架時,局部變量才存在(並且從技術上講,當聲明局部變量的塊處於活動狀態時),局部變量才存在。
注意,對於遞歸函數,您將獲得幾個局部變量(每個調用框架一個)。 同樣,如果多個線程具有用於聲明該變量的同一功能的活動框架,則每個活動調用框架都具有用於局部變量的地址。 最后,編譯器將優化某些變量,並且可能不會為某些變量使用任何堆棧插槽(例如,通過將該變量放入寄存器中;了解寄存器分配信息 )。
因此,您無法找到局部變量的地址,因為該局部變量可能不存在-其功能沒有活動的調用框架-或存在乘法- 遞歸的多個活動的調用框架-。
因此,您的問題毫無道理!
當然,您可以在函數中聲明局部變量的代碼中存儲一些局部變量的地址(例如,在全局變量中,在堆中某些記錄的字段中等等)。 當您從聲明它的塊中退出(或返回)時,該地址將變為無效。 使用或取消引用這樣的無效地址是未定義的行為 。
打印指針的地址將是相同的,這意味着您所有的指針都指向相同的存儲位置。
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));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.