我正在考虑过去几年的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;
}
这是我不理解的结果的表格
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
未知?
其余我根本无法回答,所以任何帮助都会很棒。
我知道它很久了,所以提前感谢...
答案 0 :(得分:7)
这是一个糟糕的考试问题。 C标准没有指定 如何分配存储 - 它只指定语义。堆,堆栈等是特定实现的细节。请阅读C中的存储类和存储持续时间。
变量arr
在堆栈上分配(“自动变量”),但表达式*arr
和**arr
的值是通过跟随指针获得的,一般来说,它在给定指针的情况下,不可能说出内存的分配位置。类似的推理是针对另一个未知的案例。
答案 1 :(得分:0)
关于未知:问题背后的想法是第21行*arr
已分配但未初始化。因此它指向某个任意位置。因此,**arr
的展示位置视为未知。
当然,zvrba关于语义的注释仍然有效。