变量在内存中的位置,C

yot*_*moo 0 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;
}
Run Code Online (Sandbox Code Playgroud)

这是我不明白的结果表

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
Run Code Online (Sandbox Code Playgroud)

我想我明白arr*arr,但为什么是**arr未知?其余我根本无法回答,所以任何帮助都会很棒.我知道它很长,所以提前谢谢......

zvr*_*rba 7

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

变量arr被分配堆栈("自动变量"),但该表达式的值上*arr,并**arr通过下面的指针被获得的,并且在一般情况下,这是不可能的说,其中所述存储器是分配刚刚给出的指针.类似的推理是针对另一个未知案例.