【问题标题】:How to print out a pointer value from array?如何从数组中打印出指针值?
【发布时间】:2011-04-24 03:57:33
【问题描述】:

我知道这是基本的东西,但我有一个特殊的问题。

我正在实现一个简单的shell程序,如果传递了退出值,则退出函数需要传递退出值。因此,exit 45 应该返回 45 作为值,但没有要打印的内容*。

命令被传递给char **arglist 数组中的函数解析器。由于exit 45 是两个args,我需要打印出最后一个arg。

但是,我的调试语句 printf((int)&arglist[1]) 返回一个值 163393752,它与传入的值稍有偏差。当我将printf 更改为puts 时,打印出正确的值,但exit() 需要一个整数,而不是指针。

使用此示例如何从指针数组中获取 45?

*根据教授所说,逐字引用他的措辞。

【问题讨论】:

  • 这听起来像是家庭作业……是吗?
  • 它用于学校项目。基本上我需要完成的最后一点才能满足所有要求
  • 作业与否,我认为需要显示一些代码。为什么要描述几行代码就会发生的事情,这样我们就不必猜测细节了?复制/粘贴是您的朋友。顺便说一句,听起来您需要将字符串“45”转换为int。
  • 相关代码已经在`printf((int)&arglist[0]);

标签: c pointers


【解决方案1】:

在stdlib.h 中查找atoi 函数(如果不允许使用该库,也可以编写自己的等效函数)。

【讨论】:

  • 我完全忘记了那个功能!这正是我需要的,谢谢提醒。
【解决方案2】:

printf 需要一个格式字符串;查看man page

(int)&arglist[1] 应该是 arglist[1],它是 char * 而不是 int

【讨论】:

    【解决方案3】:

    那个 printf 参数传递的是地址而不是值吗?它应该是 *arglist[1] 吗? 我对 c 指针有点生疏了。

    【讨论】:

      【解决方案4】:

      问题是&arglist[1]和&(*(arglist+1)一样,实际上是打印了arglist[1]的内存地址。如果此时要打印该值,只需打印arglist[1] - printf() 通常不需要 &。

      【讨论】:

      • 当您需要将指针*value 传递给需要实际值的函数时,&value 是正确的操作。那么对于指针数组,反之亦然?
      • 啊,指针的值一般都是带*是的。但是 array[1] 实际上会为您取消引用。因此,arglist[1] 处的 值 为 42,您可以通过调用 arglist[1] 获得。 & 运算符是地址运算符。在任何情况下,您在arglist[1] 的项目是一个字符串(即char*),所以您想要printf("%s\n", arglist[1]) - 或者像其他人建议的那样,使用atoi() 将其转换为整数
      【解决方案5】:

      我猜你想做的是这样的:

      ./your_program # run your_program
      ret_val=$? # gets exit status and stores into $ret_val
      ./other_program $ret_val # pass exit status of your_program to other_program as a argument
      

      但是,将值从一个程序传递到另一个程序并不是正确的方法。因为只使用了程序退出状态的低 8 位,请参见:http://linux.die.net/man/3/exit。

      您可以将值从一个程序传递到另一个程序使用exit iff您的目的是传递退出状态(8位数字)而不是退出值(整数)。

      将值传递给其他程序的典型方法是打印该值:例如:

      你的程序:

      printf("%d", value);
      exit(0);
      

      在外壳中:

      value=`./your_program` # run your program and store output into 'value'
      ./other_program $value
      

      在 other_program 中:使用strtol(atoi 已弃用)将字符串转换为整数:

      int value = stdtol(argv[1], NULL, 10);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多