【问题标题】:How to get pointer sized integer using scanf?如何使用scanf获取指针大小的整数?
【发布时间】:2012-08-27 00:46:06
【问题描述】:

我有一些用于 FlexLM 的继承代码,它将整数转换为需要在 32 位和 64 位机器上工作的指针。整数正在从参数的 argc 中填充到程序中,使用 scanf 读取整数值。

我应该如何可靠地读取 argc 字符串以获得适合分配给指针的值,以便它可以在 32 位和 64 位机器上工作?

目前代码如下所示:

// FlexLM includes this:
typedef char * LM_A_VAL_TYPE; /* so that it will be big enough for */
                              /* any data type on any system */

// My main() includes this:
[...]
if (!strcmp(argv[i], "-maxlen")) {
  int max = 0;
  i++;

  if (i >= argc) {
    break;
  }
  sscanf(argv[i], "%d", &max);
  if (!max) {
    fprintf(stderr, "Error: -maxlen %s Invalid line length\n", argv[i]);
  } else {
    lc_set_attr(lm_job, LM_A_MAX_LICENSE_LEN, (LM_A_VAL_TYPE)max);
  }
}
[...]

起初我想我可以使用uintptr_t,但我如何让scanf 知道相应的大小?也许我应该使用%p 将其作为指针值读取,但手册页让我怀疑它是否可靠地工作:

   p      Matches an implementation-defined set of sequences, which shall be the
          same as the set of sequences that is produced by the %p  conversion
          specification  of  the  corresponding fprintf()  functions.  The
          application  shall  ensure that the corresponding argument is a pointer
          to a pointer to void. The interpretation of the input item is
          implementation-defined. If the input item is a value converted earlier
          during the same program execution, the pointer that results shall
          compare equal to that value; otherwise, the behavior of the %p
          conversion specification is undefined.

我宁愿不使用 #ifdef 根据指针大小制作两个单独的版本,因为这对我来说似乎是代码上的一个丑陋的疣。

【问题讨论】:

  • 它是使用 C++ 编译器构建的 C++ 应用程序的一部分,尽管这部分非常类似于 C。

标签: c++ 32bit-64bit command-line-arguments scanf flexlm


【解决方案1】:

C99 inttypes.h 应该定义一个宏 SCNuPTR,它是您平台上用于 ​​uintptr_t 参数的正确 scanf 格式说明符。

uintptr_t intptr = 0;
sscanf(argv[i], SCNuPTR, &intptr);

【讨论】:

    【解决方案2】:

    32 位程序在 64 位架构中运行良好。

    int address = 0x743358;
    int *foo = reinterpret_cast<int*>( address );
    

    我猜this 就是你要找的。​​p>

    【讨论】:

    • 不,我必须构建一个 64 位应用程序。
    • 我们不要依赖答案中的链接,而仅将它们用于备份。链接可能会随着时间的推移而过时,在这种情况下,当我点击您的链接时,答案不会突然出现。
    猜你喜欢
    • 2019-09-19
    • 2018-09-08
    • 1970-01-01
    • 2017-06-26
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多