C中的数组和指针之间有什么区别?
这个问题可能听起来很愚蠢,但我并不确定。 我的意思是,有什么区别:
char* line = (char*) malloc(MAX_LINE_LEN);
和
char line[MAX_LINE_LEN];
究竟? 我知道前者是一个指针,后者是一个数组,但系统如何区分这个差异? 如何分配/存储内存?
另外,为什么当它被声明为一个指针时删除line
占用的内存,而不是当它是一个数组? 我认为一个数组存储在其他地方,当超出范围时,系统会自动释放它的内存,这在处理指针时不会发生,因此您必须自己删除它。 我错了吗?
char* line = (char*) malloc(MAX_LINE_LEN);
这是不好的风格; 你不需要在C中投入malloc
。让我们把它分成两部分,因为它更容易描述和比较:
char *line;
声明一个指向char命名line
的指针。 你可以指定它指向一个对象(或没有)。 所述sizeof
一个目的是它的类型的大小,所以sizeof (line)
是sizeof (char *)
它从系统而异,。 &line
是一个char *
的地址,它的类型是char **
(指向char的指针)。 它的存储时间取决于它的声明位置:
如果它在任何函数之外声明,则它具有静态存储持续时间,该持续时间持续该程序的生命周期。 静态存储持续时间的对象被初始化为0
,除非存在明确的初始化(例如在你的情况下)。 0
是一个null pointer constant
,表明如果在没有初始化函数的情况下在函数之外声明该对象将指向任何内容。
如果它是在一段代码中声明的,则它具有自动存储持续时间,该持续时间持续到执行到达该代码块的末尾。 具有自动存储持续时间的对象在使用之前必须显式初始化或分配给它们,因为它们的值在其他情况下是不确定的。
你的初始化为它分配一个值,所以它不会从不确定开始。 malloc
返回一个指向具有动态存储持续时间的对象的指针,这意味着指针指向的对象会一直存在,直到它明确free
为止d。
想想这line
就像邮件信封上的邮政编码; 你可以在那里写一些东西,这些东西会指出你可以找到对象(和人)的位置。 邮编不会告诉你任何有关对象(或人物)的大小。
char line[MAX_LINE_LEN];
这声明了一个MAX_LINE_LEN
字符数组。
如果在任何函数之外声明,则它具有静态存储持续时间,并且整个数组都是零填充的。
如果在函数或代码块中声明,它具有自动存储持续时间,并且数组中的值是不确定的; 它们需要被初始化(例如char line[MAX_LINE_SIZE] = { 0 };
将初始化它们)或赋值给它们(例如line[0] = '