我需要在int指针输出参数中存储字符串的内存地址。我已经创建了下面的代码来测试实现。
void getMemAddress (int *a) {
char str[80] = "Hello world";
a = (int*)&str; // Assign memory address of str to a
printf("%s", (char*)a);
}
int main(int argc, const char * argv[]) {
int *memaddress;
getMemAddress(memaddress);
printf("%s", (char*)memaddress);
return 0;
}
printf("%s", (char*)a);
打印“Hello World”,但应该
printf("%s", (char*)memaddress);
打印空
如何使用它访问原始字符串来检索实际的内存地址?
谢谢!
答案 0 :(得分:-1)
参数通过C中的值传递。在stackoverflow上已经无数次回答了类似的问题。
你需要这个:
void getMemAddress (int **a) {
char str[80] = "Hello world";
*a = (int*)str; // Assign memory address of str to *a
printf("%s", (char*)*a);
}
int main(int argc, const char * argv[]) {
int *memaddress;
getMemAddress(&memaddress);
printf("%s", memaddress);
return 0;
}
将内存地址转换为int不会在64位系统上运行。在32位系统上它可以工作,但它不是很干净。
其他问题。您将返回堆栈上的本地变量的地址。一旦离开getMemAddress
函数,str
缓冲区将被以下函数调用覆盖(也是一个经典问题)。永远不要返回局部变量的地址。
答案 1 :(得分:-1)
要修改函数中的某些内容,需要将指针传递给要修改的内容。
在这种情况下,您需要修改指针,因此需要将指针传递给指针。
void getMemAddress (int **a) { // <-------------- added a *
char str[80] = "Hello world";
*a = (int*)str; // <-------------- added a *
printf("%s", (char*)*a); // <-------------- added a *
}
int main(int argc, const char * argv[]) {
int *memaddress;
getMemAddress(&memaddress); // <-------------- added a &
printf("%s", (char*)memaddress);
return 0;
}
此外,&str
应为&str[0]
或str
。
此外,str
是一个局部变量,因此getMemAddress
返回后它将停止存在(然后printf
中的main
调用可能< / em>打印垃圾)。您可以设置str
static
,也可以返回指向字符串文字的指针(char *str = "Hello world"; *a = (int*)str;
)。
答案 2 :(得分:-1)
您正在将&str
的地址分配给指针a
的函数本地副本。你需要的是修改getMemAddress,使它int **a
作为参数,并像这样分配:
*a = (int *) str;
然后在main
:
int *memaddress;
getMemAddress(&memaddress);
还有一件事 - str
只存在于你的函数中。退出该功能后,您将无法访问它。要解决此问题,请将str
设为char指针并使用malloc
为其分配一些内存。然后使用strcpy
插入字符串。