【问题标题】:Memory questions and functions记忆问题和功能
【发布时间】:2013-08-14 05:30:55
【问题描述】:

希望你们都度过了一个美好的夏天!

我目前正在为考试复习,并在过去的论文中提出了几个问题,我一直坚持不下去,如果您能提供任何帮助/解释,我将不胜感激! :)

这里有问题;

1.) 函数 power() 应该实现函数 n* 2^pprintf() 行的输出应该是 5*(2^2) = 20)。使用移位运算符完成函数 power() 的主体。 为什么使用移位运算符而不是math.h 中可用的幂函数是明智的?

#include <stdio.h>

int power(int n, int p) {
    << YOUR CODE GOES HERE >>
}

main () {
    printf("%d*(2^%d) = %d\n",5,2,power(5,2));
}

2.) 内存被组织在称为文本、数据、堆栈和堆的区域中。下面的程序定义了变量abc。每个变量的内容存放在哪个内存区域?

#include <stdio.h>
#include <stdlib.h>

int a = 5;

int func1(int x) {
    int b=5;
}

main {
    char * c;

    c = (char*) malloc (a+1);
    func1(a);
    return 0;
}

我还有几个问题要问,但会看看这些是怎么回事!实际上我以前从未使用过stackoverflow,所以如果我做错了什么,请放轻松!

非常感谢,

【问题讨论】:

  • 其他人已为您完成此操作,但将来,您可以通过突出显示代码段并单击 {} 按钮来格式化代码段。
  • 感谢 Michelle 的提醒,感谢 mbratch 为我更改它!我为它在第一篇文章中的格式如此糟糕而道歉,但那是我在这个网站上的第一篇文章! :)
  • 没问题,只要你能学会。此外,如果您正在寻找代码(例如power() 函数),您应该先自己尝试一下,然后,如果它不起作用,请提供您的尝试和结果,以便我们引导您朝着正确的方向前进。
  • @Michelle ,只是想问一下,如果我有更多问题,我应该发布一个新问题还是用一个新问题回答这个问题?
  • 如果您需要扩展特定答案(例如,“x 是什么意思”,或“您能解释一下 y 的含义”),您应该对该答案发表评论。如果它与这个问题密切相关(有人必须阅读此内容才能理解),请编辑您的问题,否则,发布一个新问题。永远不要发布新问题作为答案。

标签: c memory malloc heap-memory stack-memory


【解决方案1】:

1 -

因为问题希望您展示如何使用移位运算符来发挥我们的力量;不是为了表明你知道如何使用 c 运行时库。

2

a - data
b - stack
c - stack

他可能想要 c - 堆,但事实并非如此。 c的内容在栈上

【讨论】:

  • 他的意思可能是*c 的内容在堆上。 :)
  • 感谢您这么快的回复!对于问题 1,我也可以问一下,您可以为 > 部分提供解决方案吗?同样对于 2,您能否进一步解释为什么每个 a/b/c 都是这样的?非常感谢!
  • @DanDoughty 拿纸和笔。什么是二进制的 2⁰、2¹、2² 等等?你找到规律了吗?
  • 当然是 2,4,8,16,32 等等......但这要求使用移位运算符在 C 中实现,我必须承认我是一个完整的新手!我知道答案是每次左移 1 位?
  • @DanDoughty 关键字是“二进制”。把你写的数字列表翻译成二进制,看看你能不能发现这个模式。
【解决方案2】:

1>

#include <stdio.h>


int power(int n, int p) 

{

return n<<p; // p is the number of bits left-shifted
}

main () 

{
printf("%d*(2^%d) = %d\n",5,2,power(5,2));
}

2>

a:数据 b: 堆栈 c: 堆栈

【讨论】:

  • 我认为 power() 是假的,应该是:n*( 1
  • 我可以要求对问题 2 进行解释吗?
  • 对不起 Saikat 我的意思是关于数据/堆栈/堆的问题
  • @Saikat Kumar Dey:char 指针在堆栈上。它指向堆
  • 考虑一下:a 是全局变量,b 是局部变量(或自动变量),c 是指向堆上动态分配的内存的指针。 C 程序的内存表示是这样的:全局变量存储在数据段上,本地(或自动)变量存储在堆栈上,内存在堆上动态分配。 @Dan,请参考geeksforgeeks.org/memory-layout-of-c-program
【解决方案3】:

首先,我会让你编写自己的代码,这是最好的学习方式。但是,我将回答这些问题背后的理论......

1) 将数字 2 提高到 n 次方时,与将 2 自身乘 n 次相同。但是乘以 2 与将数字加倍相同,计算机将它们的数字存储在以 2 为底的值中。例如,6 == 0b00110 的二进制值,但是当所有位都向左移动 1 时,则 12 == 0b01100 ,与 6*2 相同。因此,例如,16 == 4^2 = 4*4 = 4*(2*2) 或二进制 16 == 0b010000 == 0b001000*2 = (0b00100)*2*2。

2) 当变量在所有例程之外声明时,它位于“全局”存储中,也可能称为“数据”。当一个变量在例程中声明时,它是一个“自动”变量(意味着它是自动的)并在堆栈上分配。当一个变量被显式分配时,以malloc为例,那么它是在堆上分配的。

在 C 中,指针有两个数据组件或存储元素。首先,是指针本身,它通常只使用 4 个字节。然后为数据分配任何长度的数据。再说什么会重复其他答案提供的信息!

free 在堆上分配的所有存储都是一个很好的编程习惯。虽然,系统应该在main 退出时释放该存储空间,但这并不总是得到保证,尤其是在小型或嵌入式系统上。因此,代码示例应以以下方式结束:

    free(c);
    return 0;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 2011-01-24
    • 2019-06-13
    • 2018-05-02
    相关资源
    最近更新 更多