2017-07-03 95 views
1

我希望創建一個pointer這意味着一個數組。數組的大小和類型(int,double,string等)由函數決定,也取決於數值。我嘗試過void**,但我得到了segment error在函數內分配變量類型和大小數組(C++)

char f(void** return_list){ 

    /*...*/ 

    /*If need integer array*/ 
    int int_input=1;   // for example 
    int argument_number=2;  // for example 

    return_variable=new void*[argument_number]; 
    for(int j=0;j<=argument_number;j++){ 
     return_variable[j]=new void*; 
     *(int*)return_variable[j]=int_input; 
    } 

    /*If need boolean array*/ 
    /*...*/ 

return 0; 
} 

int main(int ARGC,char* ARGS[]){ 

char c=0; void** ret_list; 
c=f(ret_list); 
if(!c){std::cout<<*(int*)ret_list[0]<<"\n";} 

return 0;} 

注: 我不能與陣列/指針返回功能f();我需要返回char/integer。

+5

您的代碼具有比一些酒店我住在一個不幸多顆使用模板。 – Ron

+0

'參數號' - >未聲明的標識符 – 21koizyd

+0

@ 21koizyd:我已經添加了'int argument_number'。謝謝你的提示。 –

回答

0

如果你想要做類似的東西,我認爲你schould使用

void* return_variable = ::operator new[](argument_number); 

或簡單的使用模板或多個指定專門的模板。

2

如果你想要的是一個函數,它可以創建一個在運行時決定的大小數組並將其初始化爲一個特定的值(因爲您使用的是C++)我的建議是使用模板。

像下面這樣的東西應該工作:

template<typename TYPE> 
TYPE* f(const TYPE input, const size_t SIZE) { 
    TYPE* ret = new TYPE[SIZE]; 
    std::fill(ret,ret+SIZE,input); 
    return ret; 
} 

你可以使用它作爲在以下主要:

int main() 
{ 
    int size = 10; 
    int initval = 2; 

    int* p = f<int>(initval, 10); 
    for (size_t i = 0; i < size; i++) 
     cout << p[i] << " "; 
    cout << endl; 

    initval *= 2; 
    size *= 2; 
    double* q = f<double>(initval, size); 
    for (size_t i = 0; i < size; i++) 
     cout << q[i] + 0.5f << " "; 

    delete[] p; 
    delete[] q; 
} 

它創建大小10int數組和大小20的數組類型爲double並在標準輸出上打印它們。

2 2 2 2 2 2 2 2 2 2 
4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 

此外,因爲使用的是C++也考慮到使用原始指針。改爲使用unique_ptrshared_ptr

+0

您可能想要傳入p或d作爲參數,可以重新調用char或int,以顯示如何按照問題完成此操作,但對於C++爲+1。 – doctorlove

2

這裏有2個函數變體。一個是你的修復程序,它分配一個數組指針,然後分配一個指向你感興趣的數據類型的指針。我認爲你是這樣想的。你只需要三星級酒店:-)。這是'C'風格。您將需要特別注意以後刪除所有這些內容。

的第二個使用模板在C++風格,只是分配類型的數組你有興趣:

#include <iostream> 
using namespace std; 

void allocateArrayC(void ***array, int size) { 
    *array = new void *[size]; 
    for (int i = 0; i < size; i++) 
    (*array)[i] = new int(i); 
} 

template<class T> 
void allocateArrayCPP(T **array, int size) { 
    *array = new T[size]; 
    for (int i = 0; i < size; i++) 
    (*array)[i] = i; 
} 

int main() { 
    void **arrayC; 
    allocateArrayC(&arrayC, 10); 
    for (int i = 0; i < 10; i++) 
    cout << *(int*)arrayC[i] << endl; 

    int *arrayCpp; 
    allocateArrayCPP(&arrayCpp, 10); 
    for (int i = 0; i < 10; i++) 
    cout << arrayCpp[i] << endl; 

} 
+0

順便說一句,如果你在參數中使用引用而不是指針:'(void **&array)'或'(T *&array)''你可以有'array [i] = ...'和'allocateArray(array,...)' – Serge