一个int数组内存初始化的讨论
2010-09-04 21:06
246 查看
在C++ primer中,有很多关于new int[10]等语言的描述和例子。 如8.4.3中:
int * pia = new int[104];
pia是一个指向1024的int类型的数组的指针,而这个数组中,所有的数据都是没有被初始化过的。
然而,我的例子程序显示,整个数组时被初始化过的,莫非是编译器相关?
我的输出结果是:
ewuming@cnshc0032 []: g++ -o a.out array.cc
ewuming@cnshc0032 []: ./a.out
array value: 1074592164
array value: 1074588840
array value: -1073748456
array value: 134515377
array value: 1073834604
arr value: 0 arr address: 0x804a008
arr new value: 0 arr address: 0x804a008
arr value: 0 arr address: 0x804a010
arr new value: 0 arr address: 0x804a010
arr value: 0 arr address: 0x804a018
arr new value: 0 arr address: 0x804a018
arr value: 0 arr address: 0x804a020
arr new value: 0 arr address: 0x804a020
arr value: 0 arr address: 0x804a028
arr new value: 0 arr address: 0x804a028
arr value: 0 arr address: 0x804a030
arr new value: 0 arr address: 0x804a030
arr value: 0 arr address: 0x804a038
arr new value: 0 arr address: 0x804a038
arr value: 0 arr address: 0x804a040
arr new value: 0 arr address: 0x804a040
arr value: 0 arr address: 0x804a048
arr new value: 0 arr address: 0x804a048
arr value: 0 arr address: 0x804a050
arr new value: 0 arr address: 0x804a050
*** glibc detected *** free(): invalid pointer: 0x0804a030 ***
ewuming@cnshc0032 []: which g++
/usr/bin/g++
ewuming@cnshc0032 []: which g++
ewuming@cnshc0032 []: g++ -v
Reading specs from /usr/lib/gcc-lib/i586-suse-linux/3.3.3/specs
Configured with: ../configure --enable-threads=posix --prefix=/usr --with-local-prefix=/usr/local --infodir=/usr/share/info --mandir=/usr/share/man --enable-languages=c,c++,f77,objc,java,ada --disable-checking --libdir=/usr/lib --enable-libgcj --with-gxx-include-dir=/usr/include/g++ --with-slibdir=/lib --with-system-zlib --enable-shared --enable-__cxa_atexit i586-suse-linux
Thread model: posix
gcc version 3.3.3 (SuSE Linux)
在使用传统c语言的编程方法(int array[5];)中,这个是可以理解的,普通的数组都是没有被初始化过的。
在使用C++语言的编程方法(int* arr = new int[10];)中,我觉得应该是所有数据都是被初始化过的。
这样,为什么Lippman在书中专门如此提到呢?
纳闷中。。。。。
int * pia = new int[104];
pia是一个指向1024的int类型的数组的指针,而这个数组中,所有的数据都是没有被初始化过的。
然而,我的例子程序显示,整个数组时被初始化过的,莫非是编译器相关?
#include <iostream> #include <vector> using namespace std; int main() { int array[5]; int* arr = new int[10]; for(int i = 0; i < sizeof(array)/sizeof(int); i++) { std::cout << "array value: "<< array[i] << endl; } for(int i = 0; i < 10; i++) { std::cout << "arr value: " << *arr << " arr address: " << &arr[i] << endl; std::cout << "arr new value: " << arr[i] << " arr address: " << &arr[i] << endl; arr++; } delete[] arr; }
我的输出结果是:
ewuming@cnshc0032 []: g++ -o a.out array.cc
ewuming@cnshc0032 []: ./a.out
array value: 1074592164
array value: 1074588840
array value: -1073748456
array value: 134515377
array value: 1073834604
arr value: 0 arr address: 0x804a008
arr new value: 0 arr address: 0x804a008
arr value: 0 arr address: 0x804a010
arr new value: 0 arr address: 0x804a010
arr value: 0 arr address: 0x804a018
arr new value: 0 arr address: 0x804a018
arr value: 0 arr address: 0x804a020
arr new value: 0 arr address: 0x804a020
arr value: 0 arr address: 0x804a028
arr new value: 0 arr address: 0x804a028
arr value: 0 arr address: 0x804a030
arr new value: 0 arr address: 0x804a030
arr value: 0 arr address: 0x804a038
arr new value: 0 arr address: 0x804a038
arr value: 0 arr address: 0x804a040
arr new value: 0 arr address: 0x804a040
arr value: 0 arr address: 0x804a048
arr new value: 0 arr address: 0x804a048
arr value: 0 arr address: 0x804a050
arr new value: 0 arr address: 0x804a050
*** glibc detected *** free(): invalid pointer: 0x0804a030 ***
ewuming@cnshc0032 []: which g++
/usr/bin/g++
ewuming@cnshc0032 []: which g++
ewuming@cnshc0032 []: g++ -v
Reading specs from /usr/lib/gcc-lib/i586-suse-linux/3.3.3/specs
Configured with: ../configure --enable-threads=posix --prefix=/usr --with-local-prefix=/usr/local --infodir=/usr/share/info --mandir=/usr/share/man --enable-languages=c,c++,f77,objc,java,ada --disable-checking --libdir=/usr/lib --enable-libgcj --with-gxx-include-dir=/usr/include/g++ --with-slibdir=/lib --with-system-zlib --enable-shared --enable-__cxa_atexit i586-suse-linux
Thread model: posix
gcc version 3.3.3 (SuSE Linux)
在使用传统c语言的编程方法(int array[5];)中,这个是可以理解的,普通的数组都是没有被初始化过的。
在使用C++语言的编程方法(int* arr = new int[10];)中,我觉得应该是所有数据都是被初始化过的。
这样,为什么Lippman在书中专门如此提到呢?
纳闷中。。。。。
相关文章推荐
- 怎么定义一个int[n]数组且初始化
- 数组初始化问题:int a[3]={0}和int a[3]={1}的区别
- 一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它
- 一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。
- 第十六讲项目1.4—创建长度16的整型数组a并初始化前15个元素,输入一个整数b,将b插入到a[0]位置
- 定义一个二维int数组,编写代码获取最小元素
- 二、 编写函数int stat(int a[],int n,int c[][2])。a指向的数组中保存了由n个1位整数组成的数列(n为偶数)。函数从前至后依次将a数组中每两个相邻元素拼成一个不超过2位
- memset函数不能给int(整型)数组初始化赋值
- 对一个对象初始化内存图解
- 产生一个int数组,长度为10,并向其中随机插入1-10,并且不能重复
- C#中如何将一个string数组转换为int数组
- 有一段文本,将文本中的所有单词,存放到一个字符指针数组中(要求每个单词内存恰好)。
- 在控制台输入一段文本,将文本中的所有单词,存放到一个字符串数组中。 ( 要求占用内存最少)
- java笔试题---程序产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
- 初始化一个数组
- 计算一个数组所有元素之和(基于多处理器的并行开发讨论)
- 第十四周项目一数组大折腾(4)创建一个长度为16的整形数组a并初始化,删除数组中所有能被3整除的元素(数组中实际有效使用的元素将不足16),输出删除后数组中的全部元素
- 创建一个数组,实现数组的初始化,清空以及逆置
- 编写一个函数,返回一个int数组中存储的最大数值,并在一个简单的程序中测试这个函数。(有缺陷)
- 初始化一个NULL-terminated array of strings in C (以NULL结尾的字符串数组)