English 中文(简体)
从职能中恢复动态形成的阵列
原标题:Returning a dynamically created array from function
  • 时间:2010-03-20 20:31:44
  •  标签:
  • c++
  • gcc

我试图创建一种能够动态地分配阵列、确定各要素的价值观、以及恢复阵列规模的职能。 阵列变量是一个指点,在功能之外申报,作为参数通过。 该守则是:

#include <cstdlib>  
#include <iostream>  
using namespace std;  

int doArray(int *arr) {  
    int sz = 10;  
    arr = (int*) malloc(sizeof(int) * sz);  

    for (int i=0; i<sz; i++) {  
        arr[i] = i * 5;  
    }  

    return sz;  
}  

int main(int argc, char *argv[]) {  

    int *arr = NULL;  
    int size = doArray(arr);  

    for (int i=0; i<size; i++) {  
        cout << arr[i] << endl;  
    }  

    return 0;  

}  

出于某种原因,该方案首先终止了主食的循环! 我做了一些错误?

最佳回答

您在座标上再次通过by Value<>em>;这意味着,在do Array功能回报时,arr in main 仍为NUL----- 载于do Array的内转让n t change.

如果您希望更改 > 数值arr (int *), 您须在某一点或提及点上通过;因此,您的职能签名将包含(int *&arr)(int **arr)。 如果您将其通过为**,你也不得不将该功能中的辛醇从arr改为*arr(pointer-dereferencing),请将其改为do Array(&arr)

另外,在C++中,你实际上应当使用<条码>新[sz]而不是<条码>。

问题回答

如果你想给你以这样的方式来纪念:

int doArray(int*& arr)

否则,只有在职能范围内才能改变点。

您需在<条码>上增加间接程度。 作为书面文件,它适当分配了这些阵列,但并没有正确地将点值回给打电话者。 当你返回时,从<条码>中删除点。

如果你写出一项功能,以收取浮动价,并改变价值,将变值回打电话者,则需要点名:foo(float *f)。 同样,在座各位希望将<代码>int*的数值转至打电话者,因此必须宣布您的职能为do Array(int **arr),其次为星号。

int doArray(int **arr) {  
    int sz = 10;  
    *arr = (int*) malloc(sizeof(int) * sz);  

    for (int i=0; i<sz; i++) {  
        (*arr)[i] = i * 5;  
    }  

    return sz;  
}  

int main(int argc, char *argv[]) {  

    int *arr = NULL;  
    int size = doArray(&arr);  

    for (int i=0; i<size; i++) {  
        cout << arr[i] << endl;  
    }  

    return 0;  

}

通知其现在如何在<条码>内参考<条码>*arr,以及该呼号现在如何作为<条码>书写。

<代码>arr, 功能上的变量为:arr的本地<>copy,主要功能的符号是, 原文没有更新。 你们需要通过点对点或点参照(前者还将在平原c中工作,而后在C++中工作)。

int doArray(int **arr)

int doArray(int*& arr)

改签名(具体为++):

int doArray(int *&arr)

在离开Array时,会改变这样点。

你们需要一个点子,在座标上点子。 如果你以前从未与点人进行过任何方案拟定工作,那就会造成混乱。 我认为,如果你用手法大量提及你的代码,就更容易看到正确的类型。

你有正确的想法,即(int*)可以用来代表一个阵列。 但是,如果你想要改变主机(主机)的变数价值,那么你需要一个点来,即,因此,你最终将采用(经测试的代码)像以下一些东西。

typedef int *IntArray;

int doArray(IntArray *arr) {  
    int sz = 10;  
    *arr = (IntArray) malloc(sizeof(int) * sz);  
    IntArray theArray = *arr;

    for (int i=0; i<sz; i++) {  
        theArray[i] = i * 5;  
    }  

    return sz;  
}

在打电话时,你需要通过你变量的地址(S doArray知道什么地方写到):

int main(int argc, char *argv[]) {  

    int *arr = NULL;  
    int size = doArray(&arr);  

    for (int i=0; i<size; i++) {  
        cout << arr[i] << endl;  
    }  

    return 0;  

}  

这应当行之有效。

正如其他人指出的,你重新通过贵重阵列(正文*),因此,你说:arr=......,你不再实际改变你所穿的阵列。

你还记得,正如你写的。 当你只打电话do Array时,这并不是大事,但如果它多次被点召,而且如果你用<代码>newd(或deleted,那么它就会造成问题。 处理这一问题的最佳途径通常是使用STL。 页: 1

#include <vector>
#include <iostream>
int doArray(std::vector<int> &arr) {  
    int sz = 10;
    arr.resize(sz);  
    for (int i=0; i<sz; i++) {  
        arr[i] = i * 5;  
    }
    return sz;  
}

int main(int argc, char *argv[]) {  
    std::vector<int> arr;
    int size = doArray(arr);  
    for (int i=0; i<size; i++) {  
        std::cout << arr[i] << std::endl;  
    }
    return 0;  
}

但是,由于你可以要求<代码>arr.size(),而且如果你真的有活力,可以像(>for_each_iter那样使用功能。





相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?

热门标签