将内存地址作为out参数返回功能

时间:2015-12-03 20:02:43

标签: c pointers reference

我需要在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); 

打印空

如何使用它访问原始字符串来检索实际的内存地址?

谢谢!

3 个答案:

答案 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插入字符串。