关于数组初始化的问题

时间:2021-09-23 19:47:28
谭浩强的C语言教材在数组一章中说“C语言规定只有静态存储数组和外部存储数组才能够初始化”,那就是说在函数中定义的数组如果要初始化就必须在前面加上static,但是我们不加static编译也并没有出错,是不是有矛盾呀?如果不加static合法,那么这样定义的数组又是存放在哪里呢?是栈内存还是静态内存?

17 个解决方案

#1


mark

#2


谭浩强的C语言教材在数组一章中说“C语言规定只有静态存储数组和外部存储数组才能够初始化”,那就是说在函数中定义的数组如果要初始化就必须在前面加上static,但是我们不加static编译也并没有出错,
--------------------------------------------------------------
潭的书还是别看的好,误人。如果不考虑上下文,单从他这句话来看是错误的,应该说,只有静态和全局数组才会自动初始化。局部数组需要手工初始化。


如果不加static合法,那么这样定义的数组又是存放在哪里呢?是栈内存还是静态内存?
----------------------------------------------------------------------
栈中。

#3


“C语言规定只有静态存储数组和外部存储数组才能够初始化”
他这里说的和我们理解的可能不一致,
他所谓的初始化,可能是分配空间,
而我们理解的是赋初值。
分配了空间不一定就赋了初值,对吧。
个人观点,仅供参考。

#4


我翻了一下谭的书,没找到,你能告诉我在哪一页吗?
让我理解一下上下文。

#5


在82页,一维数组的初始化一节

#6


我的谭浩强是第二版的,一维数组初始化在123页,也没有找到你说的那句话。
不知道你的书是哪个版本的?

#7


放在数据段的数组,也就是static和全局数组,会被自动初始化为1的

而在栈区定义的数组,也就是临时数组,只给数组分配空间,但是空间中的值是这段内存本来的值,不会去初始化的,要手动来做。

#8


是1991年7月第一版,1999年3月第35次印刷;其实我遇到的是这样的一道题:
char *getstring()
{
   char p[] = "hello";
   return p;
}

char *getstring()
{
   char *p = "hello";
   return p;
}
说这两个函数定义的字符串的存储位置不同,第一个是栈,而第二个是静态存储,所以才引发了我的思考

#9


这种直接用""声明的字符串都是在数据段,也就是静态存储区的

#10


不是吧,字符串也是作为字符数组来处理的,如果加了static就是在数据段,如果是临时数组就应该在栈中吧
char p[] = "hello";和
char p[] = {'h','e','l','l','o'};是一样的

#11


char p[] = "hello";

这个"hello"自身就放在静态区,然后用这个数组,来给你的p数组做初始化

#12


char *getstring()
{
   char p[] = "hello";
   return p;
}
//这是在函数内定义数组,存放在栈里,因此return p会有问题(函数调用结束,p的空间将回收)

char *getstring()
{
   char *p = "hello";
   return p;
}
//这是在函数内定义指针,指向一个常字符串,这样不会有问题(常字符串在静态数据区内,不回收)

#13


楼上的能说一下,c在处理
char p[] = "hello";
char *p = "hello";
时,有什么不同吗?
以前我看书,看到过,
char p[] = "hello";好像是先生成一个无名数组,再拷贝,
不过记不清了。

#14


还有不明白的可以参考K&R的<<The C Programming Language second edtion>>第90页。

#15


char p[] = "hello";
等价于
char p[] = {'h','e','l','l','o','\0'};
并非像楼上几位所说p[]和"hello"有各自的存储空间

#16


这么一个简单的问题各位却众说纷纭,这个问题我是在林锐博士的“高质量C++编程”里面看到的,上面的解释和阿明的说法一样;但是我觉得最好我们得在实践中检验一把,看究竟是怎样得存储,这才是唯一得标准

#17


这个问题简单吗?
笑话,至少我觉得有争议是很正常的,
一般的书上没有说明,
不要把问题说的怎么的简单,好像自己很牛似的,
我觉得阿明也没说出个所以然来,
至少我看起来还是很迷糊。

#1


mark

#2


谭浩强的C语言教材在数组一章中说“C语言规定只有静态存储数组和外部存储数组才能够初始化”,那就是说在函数中定义的数组如果要初始化就必须在前面加上static,但是我们不加static编译也并没有出错,
--------------------------------------------------------------
潭的书还是别看的好,误人。如果不考虑上下文,单从他这句话来看是错误的,应该说,只有静态和全局数组才会自动初始化。局部数组需要手工初始化。


如果不加static合法,那么这样定义的数组又是存放在哪里呢?是栈内存还是静态内存?
----------------------------------------------------------------------
栈中。

#3


“C语言规定只有静态存储数组和外部存储数组才能够初始化”
他这里说的和我们理解的可能不一致,
他所谓的初始化,可能是分配空间,
而我们理解的是赋初值。
分配了空间不一定就赋了初值,对吧。
个人观点,仅供参考。

#4


我翻了一下谭的书,没找到,你能告诉我在哪一页吗?
让我理解一下上下文。

#5


在82页,一维数组的初始化一节

#6


我的谭浩强是第二版的,一维数组初始化在123页,也没有找到你说的那句话。
不知道你的书是哪个版本的?

#7


放在数据段的数组,也就是static和全局数组,会被自动初始化为1的

而在栈区定义的数组,也就是临时数组,只给数组分配空间,但是空间中的值是这段内存本来的值,不会去初始化的,要手动来做。

#8


是1991年7月第一版,1999年3月第35次印刷;其实我遇到的是这样的一道题:
char *getstring()
{
   char p[] = "hello";
   return p;
}

char *getstring()
{
   char *p = "hello";
   return p;
}
说这两个函数定义的字符串的存储位置不同,第一个是栈,而第二个是静态存储,所以才引发了我的思考

#9


这种直接用""声明的字符串都是在数据段,也就是静态存储区的

#10


不是吧,字符串也是作为字符数组来处理的,如果加了static就是在数据段,如果是临时数组就应该在栈中吧
char p[] = "hello";和
char p[] = {'h','e','l','l','o'};是一样的

#11


char p[] = "hello";

这个"hello"自身就放在静态区,然后用这个数组,来给你的p数组做初始化

#12


char *getstring()
{
   char p[] = "hello";
   return p;
}
//这是在函数内定义数组,存放在栈里,因此return p会有问题(函数调用结束,p的空间将回收)

char *getstring()
{
   char *p = "hello";
   return p;
}
//这是在函数内定义指针,指向一个常字符串,这样不会有问题(常字符串在静态数据区内,不回收)

#13


楼上的能说一下,c在处理
char p[] = "hello";
char *p = "hello";
时,有什么不同吗?
以前我看书,看到过,
char p[] = "hello";好像是先生成一个无名数组,再拷贝,
不过记不清了。

#14


还有不明白的可以参考K&R的<<The C Programming Language second edtion>>第90页。

#15


char p[] = "hello";
等价于
char p[] = {'h','e','l','l','o','\0'};
并非像楼上几位所说p[]和"hello"有各自的存储空间

#16


这么一个简单的问题各位却众说纷纭,这个问题我是在林锐博士的“高质量C++编程”里面看到的,上面的解释和阿明的说法一样;但是我觉得最好我们得在实践中检验一把,看究竟是怎样得存储,这才是唯一得标准

#17


这个问题简单吗?
笑话,至少我觉得有争议是很正常的,
一般的书上没有说明,
不要把问题说的怎么的简单,好像自己很牛似的,
我觉得阿明也没说出个所以然来,
至少我看起来还是很迷糊。