【问题标题】:Return the address of a global string variable返回全局字符串变量的地址
【发布时间】:2017-05-11 14:15:33
【问题描述】:

如何返回全局 char* 变量的地址?我必须为一个项目做这个。我必须根据如下所示的伪代码编写函数:

string* get_variable_address();

C 没有字符串,所以我假设string* 将变为char**。我已经尝试了很多东西,但我无法让它工作。我所拥有的看起来像这样:

#include <stdio.h>

char test[100] = "Get my address";

int main(void) {
    char** address = return_variable_address();

    printf("The address is: %s\n", *address);

    return 0;
}

char** return_variable_address() {
    return &test;
}

【问题讨论】:

  • 这又是来自那个 CS-50 的废话教程吗?
  • %s 是字符串的格式,如果你想打印一个指针值,你想使用%p
  • 为什么不用char * test = "Get my address" 而不是char test[100] = "Get my address"
  • @Lundin 不,不是。这是一个英特尔 SGX 项目。目的是展示有问题的 enclave 代码如何仍然允许攻击者检索 enclave 的秘密。
  • 问题是数组的地址是第一个元素的地址。您需要将 test 声明为char *test = "Get my address";

标签: c pointers memory-address


【解决方案1】:

C 没有字符串,所以我假设 string* 会变成 char**

可能不会。 C 中的字符串是一个字符数组,您可以通过char* 访问它。因此,您可以稍微简化程序以获得所需的结果:

#include <stdio.h>

char* return_variable_address (void);

char test[100] = "Get my address";

int main(void) {
    char* address = return_variable_address();

    printf("The content stored at the address: %s\n", address);

    return 0;
}

char* return_variable_address (void) {
    return test;
}

请注意,所有这些都是不好的做法 - 避免使用全局变量。

【讨论】:

  • 我认为 OP 需要返回 test 的地址而不是它的值,或者我误解了这个问题
  • printf 中将%s 更改为%p 并将return test 更改为return &amp;test 似乎可以完成这项工作!
  • @ThomasVanhelden 如果要打印地址,请使用%p。如果要打印(字符串的)内容,请使用%s。我不确定你想要什么,所以我更改了 printf 文本。
【解决方案2】:

牢记以下要求 -

  1. 您想要返回一个 char**,其中一个 deferencing 曾经给您字符串“Get my address”
  2. 您希望字符串是可变的。

所以你可以这样做

char test[100] = "Get my address";

char *pointer = test;

char** return_variable_address(void) {
    return &pointer;
}

int main(void) {
    char** address = return_variable_address();
    printf("The address is: %s\n", *address);
    (*address)[0] = 'F'; //Test for mutability
    printf("The address is: %s\n", *address);
    return 0;
}

我了解这些要求是针对某些安全测试的,因此非常特殊。

在这里演示:Ideone

【讨论】:

  • 我不认为返回 char** 是必需的,OP 只是对伪代码的含义感到困惑(我也会)。
  • @Lundin 是的,这很可能。无论哪种方式,任何适用于 OP 的方法。
  • 这似乎对我有用!是的,我可能对伪代码的含义感到困惑。因为作业还写着"When required for security purposes (or C limitations), you may slightly modify the entry-point signatures" 所以也许,拥有char** 并不是硬性要求。我真正需要的是一个返回全局char* 变量地址的函数。
  • char* 的@ThomasVanhelden 地址又是 char**。你在混淆你自己。也许你的意思是——我真正需要的是一个返回全局 char* 变量的函数
  • @AjayBrahmakshatriya 也许我很困惑。不过,我确信我需要一个返回全局变量地址的函数。我将尝试为您提供有关要求的更多背景信息。这是一个英特尔 SGX 项目。全局变量是驻留在安全飞地中的密码。目的是展示不安全的 enclave 代码(即泄露地址)如何让攻击者访问 enclave 的秘密。
【解决方案3】:

它可能会帮助你typedef定义string。然后很容易看出 string 变量 s 的地址与任何其他地址一样只是 &s。我希望 string 在整个项目中被大量使用,并且 typedef 还将使您免于尝试将每个 string 更改为 char*

要打印地址,请使用格式标志 %p

#include <stdio.h>

typedef char string[10];    // string defined as an arrary of 10 chars

string s = "Hello world";   // I've deliberately put a common error in here

string* return_variable_address( void )
{
    return &s;
}

int main( void )
{
    printf("Address of global var s = %p \n", return_variable_address() );

    return 0;
}

【讨论】:

    猜你喜欢
    • 2018-04-20
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 2019-06-01
    相关资源
    最近更新 更多