变量在内存中的位置,C

时间:2011-09-25 12:45:09

标签: c memory-management

我正在考虑过去几年的C考试,我遇到了一个我不完全理解的问题。他们提供了一段简单的代码,并询问了内存中不同变量的位置。选项包括heap stackunknows。 我知道在堆栈中初始化的自动变量,以及动态分配的变量都在堆中。

那么,第一个问题 - 什么是未知的?

对于第二个问题,这里是代码和正确答案的表格:

#include <string.h>
#include <stdlib.h>

typedef struct
{
    char *_str;
    int _l;
} MyString;

MyString* NewMyString (char *str)
{
    MyString *t = (MyString *) malloc (sizeof (MyString)); //LINE 12
    t->_l = strlen (str);
    t->_str = (char*) malloc (t->_l + 1);
    strcpy (t->_str, str);
    return t;
}

int main()
{
    MyString ** arr = (MyString**) malloc (sizeof (MyString*)*10); //LINE 21
    int i;
    for (i=0;i<10;i++)
    {
        arr[i] = NewMyString ("item"); //LINE 25
    }
    // do something
    // free allocated memory
    return 0;
}

这是我不理解的结果的表格

Variable     Line number     Memory location
arr              21              stack
*arr             21              heap
**arr            21              unknows
arr[5]           25              heap
arr[3]->_str[2]  25              heap
*(t->_str)       12              unknows

我想我理解arr*arr,但为什么**arr未知? 其余我根本无法回答,所以任何帮助都会很棒。 我知道它很久了,所以提前感谢...

2 个答案:

答案 0 :(得分:7)

这是一个糟糕的考试问题。 C标准没有指定 如何分配存储 - 它只指定语义。堆,堆栈等是特定实现的细节。请阅读C中的存储类和存储持续时间。

变量arr在堆栈上分配(“自动变量”),但表达式*arr**arr的值是通过跟随指针获得的,一般来说,它在给定指针的情况下,不可能说出内存的分配位置。类似的推理是针对另一个未知的案例。

答案 1 :(得分:0)

关于未知:问题背后的想法是第21行*arr已分配但未初始化。因此它指向某个任意位置。因此,**arr的展示位置视为未知。

当然,zvrba关于语义的注释仍然有效。