2013-03-14 103 views
0

我目前正在学习C++,所以如果我看起来有点傻,对不起。C++使用指针创建数组

我目前的练习,我坚持要求我编写一个函数IndexArray(int n),它返回一个指向动态分配的具有n个元素的整数数组的指针,每个元素都被初始化为它自己的索引。 (从工作表复制)。

我读过几次和不完全了解,但他们举了一个例子:

假设IntPtr的声明为

int *intPtr; 

声明

intPtr = IndexArray(10); 

应产生以下内存配置:

intPtr -> 0 1 2 3 4 5 6 7 8 9 

从这个例子我猜我的函数需要创建一个大小为n的数组,其值从0到n-1,然后另一个指针需要指向该数组。

这里是他们的测试代码:

int *values1; 
values1 = IndexArray(10); 

我知道如何轻松地创建数组,但我不完全理解指针足以知道要做什么真的。我想返回一个数组会工作:

int *IndexArray(int n) { 
    cout << n << endl; 
    int arrayTemp[n]; 
    for(int i = 0; i < n; i++) { 
     arrayTemp[i] = i; 
    } 
    return arrayTemp; 
} 

但是测试时,值1阵列不会从0-9所包含的值(虽然arrayTemp做所返回的权利之前)。

任何帮助将是惊人的,并希望我已经给你所需要的一切帮助。谢谢! :d

+0

int arrayTemp [n]; => int * arrayTemp = new int(n);分配给int arrayTemp [n]的Beacuse内存将在返回arrayTemp后被释放; – neohope 2013-03-14 05:14:53

+0

这不是C++。 C++不支持VLA(可变长度数组)。标记已更改为C – 2013-03-14 05:20:04

+0

这是C++,它不是可变长度数组。数组的长度永远不会改变。将长度发送到函数,并根据发送的长度创建数组的大小。那之后永远不会改变。 – 2013-03-14 05:26:56

回答

3
int arrayTemp[n]; 

注意,该语句是一个函数,所以当函数结束时,arrayTemp []将不提供任何更多的,它承担责任:水灾被删除:它是一个本地##变量!

所以,如果你想这样做,你可以使用:

int * arrayTemp = new int[n]; 

注意:你必须删除任何如何避免内存泄漏。

2

你不能做到这一点:

int *IndexArray(int n) { 
    cout << n << endl; 
    int arrayTemp[n]; //declare a local array 
    for(int i = 0; i < n; i++) { 
     arrayTemp[i] = i; 
    } 
    return arrayTemp; //return a pointer to a local 
} 

您可以将指针不能返回到本地。一旦你回来,本地不复存在。指针现在指向垃圾。

相反,你必须使用malloc(C或C++)或new(C++),为10个整数动态创建的存储,并且因为这是动态的堆上创建它会返回后仍然存在(和将需要free d if malloc ed或delete[] d如果它是由new制成的阵列。对于仅由new制成的单个对象,您只需使用delete

+0

我想补充一点,你也可以传递一个指向'n'' int'的指针并将其填充到函数 – 2013-03-14 05:19:46

+0

@Ed S.'IndexArray(int n ),它返回一个指向动态分配的整数数组的指针'。如果它填充传递给它的数组,它不会进行动态分配。 – Patashu 2013-03-14 05:22:24

+0

是的......我明白这一点。问题是你说你*有*使用动态分配,这是不正确的,诚实地说是一个坏主意开始。至少返回一个智能指针。另一种选择是将数组作为参数并不返回任何内容。 – 2013-03-14 06:06:05