【问题标题】:C - can variate location be promoted?C - 可以提升不同的位置吗?
【发布时间】:2017-10-20 08:05:20
【问题描述】:

我是该语言的新手,正在尝试一个简单的代码。我想尝试创建一个基于指针的循环。但似乎您不能像在汇编程序中那样提升变量位置。还是我做错了?如果我真的不能,我可以强制一个新的变量在特定位置出生吗?那是我的代码

#include <stdio.h>

int main(void) {
    int firstnumber = 1;
    int *beginning = &firstnumber;
    printf("%i %i \n",firstnumber,beginning);
    Test1(firstnumber,beginning);
    return 0;
}

Test1 (int num, int begin)
{
    int reserve = num;
    if(num != 100)
    {
        &num +=2;
        num = (reserve+1);
        return Test1(num, begin);

    }
    else
    {
        int assist = begin;
        while(*assist != 100)
        {
            printf("/n \n %i %i \n /n",num,assist);
            &assist += 2;
        }
    }
}

我知道这可能看起来很荒谬,但我真的很好奇

【问题讨论】:

  • “变体”? “变体”?也不确定您所说的“提升”是什么意思,它在 C 中具有特定的含义,这使得它令人困惑。
  • 使用Test1的原型:void Test1 (int num, int begin);
  • Test1 应该做什么?你期望什么输出?
  • 1 到 100 个循环,每个数字内存地址
  • 很抱歉让你们感到困惑。几年前我学习了汇编程序,并被告知 C 语言非常高效和强大。我只是想看看我能在这里做什么。我会接受 Martin 的建议并检查打包结构。如果可以的话,我会代表你们,我只是没有访问权限。谢谢

标签: c function loops pointers memory-address


【解决方案1】:

你是在倒过来考虑这个问题。指针是您可以移动的变量,因此可以将它们用于您想要移动的任何东西。

firstnumber 是一个整数变量 - 编译器决定它的存储位置,您不能告诉编译器将名称 firstnumber 重新绑定到不同的位置。但是,您可以随意移动指针。所以,

void Test1(int num) {
    &num +=2;
    num = 42;
}

是废话,但是

void Test2(int *num) {
    num += 2;
    *num = 42;
}

很好 - 只要 num+2 仍然是一个有效的分配对象。例如,你可以这样称呼它

int i[5];
Test2(i); /* sets i[2] = 42 */

(如果你传入一个少于 3 个整数的数组,你会得到一个运行时错误而不是编译错误,因为Test2 会损坏你的堆栈帧或它不应该接触的其他内存)。

【讨论】:

    【解决方案2】:

    不,您不能提升/更改变量位置。

    所以这个:

    int num;
    &num +=2;
    

    没有意义,会报错:

    error: lvalue required as left operand of assignment
             &num +=2;
                  ^~
    

    同样适用于:

    int assist;
    &assist += 2;
    

    您的代码只有在您修改这些语句时才能编译(但现在逻辑已更改,您应该继续努力),但现在它将导致无限循环,因为您的函数从不返回else 的情况下:

    #include <stdio.h>
    
    void Test1 (int num, int* begin);
    
    int main(void) {
        int firstnumber = 1;
        int *beginning = &firstnumber;
        printf("%i %i \n",firstnumber, *beginning);
        Test1(firstnumber, beginning);
        return 0;
    }
    
    void Test1 (int num, int* begin)
    {
        int reserve = num;
        if(num != 100)
        {
            num +=2;
            num = reserve + 1;
            return Test1(num, begin);
    
        }
        else
        {
            int assist = *begin;
            while(assist != 100)
            {
                printf("/n \n %i %i \n /n",num,assist);
                assist += 2;
            }
        }
    }
    

    祝你好运!

    【讨论】:

    • 谢谢。我至少可以让新的变种在特定的位置出生吗? (比如在特定的不同变量之后立即?)
    • 在打包结构中声明它们。
    【解决方案3】:

    好的,我更深入地检查了代码并得到了几个结论:

    函数变量不能继承他的祖先地址。因此,除非我使用一些静态变量,否则对任务使用函数是没有用的

    我有另一个结论,但我不记得是什么了。抱歉,感谢您的宝贵时间

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      相关资源
      最近更新 更多