2012-01-04 48 views
-2

说我这样做初始化一个这样的数组:为什么有人会初始化C中未分配的内存?

char a[]="test"; 

什么是这样做的目的是什么?我们知道内容可能会立即发生变化,因为它是未分配,因此为什么有人会像这样初始化数组?

+1

你是什么意思“未分配”?在这种情况下,堆栈中分配了“a”。 – elmo 2012-01-04 11:49:49

+0

是什么让你觉得'a'没有被分配?你的例子等同于'char a [5] =“test”;' – 2012-01-04 11:50:39

+0

又如何被使用? – Mark 2012-01-04 11:52:20

回答

5

为了澄清,这个代码是错误的,由OP陈述的理由:

char* a; 
strcpy(a, "test"); 

正如其他响应所指出的,语法“char a [] =”test“”实际上并没有这样做。实际效果更是这样的:

char a[5]; 
strcpy(a, "test"); 

第一条语句分配本地堆栈上的固定大小的静态字符数组,并在它的第二初始化数据。大小由字符串文字的长度决定。像所有的堆栈变量一样,该数组在退出函数作用域时自动释放。

+1

+1:没有你的答案我不会理解OP的问题 – pmg 2012-01-04 12:31:59

1

这样做的目的是在堆栈或静态数据段上分配5个字节(取决于此段的出现位置),然后将这些字节设置为数组{'t','e','s','t','\0'}

1

该语法分配的五个字符栈上的阵列,相当于此:

char a[5] = "test"; 

阵列的元件初始化到给定为一个初始化字符串中的字符。数组的大小被确定为适合初始化器的大小。

1

它被分配。该代码相当于

char a[5]="test"; 

当你离开的数量时,编译器只需在文本字符串计数的字符计算字符数组,你的长度。然后它将长度加1以包含必要的终止nul '\0'。因此,阵列的长度是5,而字符串的长度是4。

+0

长度字符串是4,它的大小是5. – ouah 2012-01-04 12:52:41

+0

@ouah,更新了我的。感谢您的反馈以及任何进一步的反馈。 – 2012-01-04 13:02:48

0

该阵列被分配为;它的大小是从用来初始化它的字符串文字(总共5个字符)中推断出来的。

假如你写

char *a = "test"; 

那么所有会得到分配将是一个指针变量,而不是一个数组(字符串文字"test"生活在内存中,以便它在程序启动时分配,并一直保持到退出程序)。