yot*_*moo 0 c memory-management
我在看过去几年的C考试,我遇到了一个我不太了解的问题.他们提供了一段简单的代码,并询问了内存中不同变量的位置.选项是heap stack和unknows.我知道在堆栈中初始化的自动变量,以及动态分配的变量都在堆中.
那么,第一个问题 - 什么是未知的?
对于第二个问题,这里的代码和表格的答案正确:
#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未知?其余我根本无法回答,所以任何帮助都会很棒.我知道它很长,所以提前谢谢......
这是一个糟糕的考试问题.C标准没有规定如何分配存储 - 它只指定语义.堆,堆栈等是特定实现的细节.阅读C中的存储类和存储持续时间.
变量arr被分配堆栈("自动变量"),但该表达式的值上*arr,并**arr通过下面的指针被获得的,并且在一般情况下,这是不可能的说,其中所述存储器是分配刚刚给出的指针.类似的推理是针对另一个未知案例.