【问题标题】:Pass void* type to main() function将 void* 类型传递给 main() 函数
【发布时间】:2026-02-02 17:10:01
【问题描述】:

我的 main() 应该得到一个地址作为输入,该地址需要存储在void* 地址中。

int main(int argc, char *argv[])
{
    if (argc > 1) {
        HandleStr = argv[1];
        printf("\n Handle passed : %s\n",HandleStr);
    }
}

我希望这个 HandleStr 为 void * 类型。我该怎么做?

现在,我想以 ./testapp "0xaf6e9800" 的身份运行 exec

【问题讨论】:

  • 您确实知道,在现代操作系统上,进程具有虚拟地址空间,更重要的是,每个进程的虚拟地址空间都与其他进程分开。这意味着一个进程中的有效地址很可能在另一个进程中无效,即使它有效也不能保证它指向相似的数据。
  • argv[] 中的参数始终是字符串 (char*)。因此,您输入的地址必须首先转换为数字,然后将其视为指针。
  • 如果你想在两个进程之间共享内存,有一个叫做shared memory的东西,即使使用它,两个进程的实际地址也很可能不同。
  • @Joachim Pileborg:典型的用例是将共享内存空间的基础传递给(非 POSIX)子进程,该子进程以相同的偏移量继承缓冲区。这些恶作剧在 Windows 上相当普遍。无论如何,我建议在这里使用“%p”printf/scanf 说明符。

标签: c main void-pointers argv


【解决方案1】:

我怀疑你想要类似的东西

HandleStr = (void *)strtol(argv[1], NULL, 16);

【讨论】:

  • strtoul 可能会更好。这并不重要,除非 OP 在具有单一统一地址空间的系统上运行(一些小型嵌入式系统的操作系统仍然这样做)。
【解决方案2】:

如果你有 C99 编译器,你应该:

  • argv[1] 作为十六进制数解码为intptr_t
  • 将该值分配给您的void *

类似:

int main(int argc, char *argv[])
{
    if (argc > 1) {
        long lh = strtol(argv[1], NULL, 16);
        if (lh != 0) {
            intptr_t ph = lh;
            void *handle = ph;
            printf("\n Handle passed : %p\n",handle);
        }
    }
}

但请注意:应该知道该值是什么以及应如何在您的程序中使用它。因为正如 Joachim Pileborg 所说,进程无法访问任何内存值。

【讨论】: