2017-10-17 3 views
-2

誰かがなぜ私がtabOfOffsetsからデータを失ったかを私に説明することができますか?私は2回同じことをして、2番目の配列でのみプログラムクラッシュを起こしました。 この配列の値を関数の最後に表示しましたが、すべてがクリアで正しいです。たぶん私はどこかで間違いをしますか? 以下はコードです。C++ allocating memory

#include<iostream> 
#include <algorithm> 

using std::cout; 
using std::endl; 

void changeSizeOfVector(int *tabValue, int *tabOffsets, int &oldSize, int 
newSize) { 
int temp = std::min(oldSize, newSize); 

int *newTabOfValues = new int [newSize] {0}; 
int *newTabOfOffsets = new int [newSize] {0}; 

for (int i = 0; i < temp; i++) { 
    newTabOfValues[i] = tabValue[i]; 
    newTabOfOffsets[i] = tabOffsets[i]; 
} 

delete[] tabValue; 
delete[] tabOffsets; 

tabValue = new int [newSize] {0}; 
tabOffsets = new int [newSize] {0}; 



for (int i = 0; i < newSize; i++) { 
    tabValue[i] = newTabOfValues[i]; 
    tabOffsets[i] = newTabOfOffsets[i]; 
    std::cout << tabOffsets[i] << tabValue[i] << endl; 
} 

oldSize = newSize; 
delete[] newTabOfValues; 
delete[] newTabOfOffsets; 
for (int i = 0; i < newSize; i++) { 
    std::cout << tabOffsets[i] << tabValue[i] << endl; 
} 

} 
int main() { 

int SIZE = 10; 

int * tabOfOffsets = new int[SIZE]; 
int * tabOfValues = new int[SIZE]; 

for (int i = 0; i < SIZE; i++) 
{ 
    tabOfValues[i] = i; 
    tabOfOffsets[i] = i; 
    cout << tabOfValues[i] << " : " << tabOfOffsets[i] << endl; 
} 

changeSizeOfVector(tabOfValues, tabOfOffsets, SIZE, 12); 


for (int i = 0; i < SIZE; i++) { 
    cout << tabOfOffsets[i] << " : " << tabOfValues[i] << endl; 

} 
delete[] tabOfOffsets; 
delete[] tabOfValues; 

}

+3

[良い初心者の本](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)を入手して、*参考文献*とどのようにして渡すか引数*を参照してください。 –

+1

配列へのポインタを使用しません。これはCスタイルのプログラミングです。 'std :: vector'を使い、参照渡ししてください。 – JHBonarius

+1

あなたが参考文献を学び、あなたのプログラムを修正する方法を知った後、*ダブルコピー*を考えてください。単純に*ポインターを割り当てないのはなぜですか? 'tabValue = newTabOfValues'のように?そして、あなたがそれを考え、実装しテストしたら、プログラムを投げ捨て、['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)の使い方を学んでください。 –

答えて

0

この関数の宣言は間違っている:

void changeSizeOfVector(int *tabValue, int *tabOffsets, int &oldSize, int 
newSize); 

が、それはあなたがそれを宣言する必要があり、それを正しく動作させるためにtabOffsetsの値ではなく、ポインタ自体を変更することができることを意味します

void changeSizeOfVector(int *tabValue, int **tabOffsets, int &oldSize, int 
newSize); 

このようにして、ポインタ自体を変更することができます新たに割り当てられた配列を割り当てます。

+0

それは本当に彼の質問に答えている...しかし、彼はSTLなどを使用することができる間、彼はCスタイルをプログラミングしているという点を回避している。 – JHBonarius

+0

ありがとうございます。あなたは私の日を作った;)。 Btw私はSTLを使用することができますが、私はこの例を持っていたと私はそれが動作していない理由を知りたいと思った。 – Sewer