私はしばらくの間、ポインタとメモリの割り当てに苦労しています。ポインターのポインタとメモリの割り当て
これは、私が実装したmaxサブアレイの問題です。それは正常に動作するようです(おそらくバグがあります)。しかし、私はタプル構造体オブジェクトのメモリストレージに関する質問があります。ご覧のように、タプルはグローバルストレージに宣言されています。後でfindMaxSubArray()関数では、Tuple構造体への3つのポインタが宣言されています。私の質問は、ポインタの逆参照(つまり、left-> sumなど)がどのように働くのかをポインター(左、右、十字)が扱っているTuple構造体インスタンスを宣言していないことです。 GNU Cコンパイラは自動的にそれらのためにストレージを割り当てますか? (私はx86のアセンブリコードを理解していない)誰かがここで何が起こっているか説明できますか?とても有難い。
#include <iostream>
using namespace std;
#define NEGINFINITY -2 << 31
typedef struct {
int lowPosition;
int highPosition;
int sum;
} Tuple;
Tuple tuple;
Tuple* findMaxCrossingSubArray(int a[], int low, int mid, int high) {
int leftSum, rightSum;
int leftMax, rightMax;
int sum;
leftSum = rightSum = NEGINFINITY;
sum = 0;
for (int i = mid; i >= low; --i) {
sum += a[i];
if (sum > leftSum) {
leftSum = sum;
leftMax = i;
}
}
sum = 0;
for (int j = mid + 1; j <= high; ++j) {
sum += a[j];
if (sum > rightSum) {
rightSum = sum;
rightMax = j;
}
}
tuple.lowPosition = leftMax;
tuple.highPosition = rightMax;
tuple.sum = leftSum + rightSum;
return &tuple;
}
Tuple* findMaxSubArray(int* array, int low, int high) {
Tuple *left, *right, *cross;
if (high == low) {
// base case
tuple.lowPosition = low;
tuple.highPosition = high;
tuple.sum = array[low];
return &tuple;
}
else {
int mid = (low + high)/2;
left = findMaxSubArray(array, low, mid);
right = findMaxSubArray(array, mid + 1, high);
cross = findMaxCrossingSubArray(array, low, mid, high);
if (left->sum > right->sum && left->sum > cross->sum)
return left;
else if (right->sum > left->sum && right->sum > cross->sum)
return right;
else
return cross;
}
}
int main() {
Tuple *result;
int data[] = {1, -2, 3, 10, -4, 7, 2, -5};
result = findMaxSubArray(data, 0, 7);
for (int i = 0; i < 8; ++i)
cout << data[i] << " ";
cout << endl;
cout << "The sum of max subarray is " << result->sum
<< " Starting at index " << result->lowPosition
<< " ending at index " << result->highPosition << endl;
}
** GNU cコンパイラは自動的にそのためのストレージを割り当てますか?** Ans:NEVER – Mahesh