次の関数「インクリメント」は配列として表される数に1を加算します。関数からの可変長配列の返却
int* increment(int array[], int size, int *sizeLen)
{
int temp[size+1];
int carry = 0;
carry = (array[size-1]+1)/10;
temp[size] = (array[size-1]+1)%10;
for(int i=size-2;i>=0;i--)
{
temp[i+1] = (array[i] + carry)%10;
carry = (array[i]+carry)/10;
}
if(carry)
{
temp[0] = 1;
*sizeLen = size+1;
return temp;
}
else
{
*sizeLen = size;
return (temp+1);
}
}
int main()
{
int array[] = {9,9,9};
int length;
int *res = increment(array, sizeof(array)/sizeof(int), &length);
for(int i=0;i<length;i++)
{
cout << res[i] << " ";
}
}
私はgccがvariable length arraysをサポートしていて、スタックに格納されていることを知っています。 この関数が終了するとtempが範囲外になることが予想され、mainに配列を出力しようとするとガベージ値が出力されるはずです。 私の場合、実際の値が表示されます。 関数内で宣言された可変長配列は、いつスコープから外れますか?
あなたが見ているのは未定義の動作です。それはCの落とし穴です。 –
C++はVLAをサポートしていません。あなたのコードは基本的にCです。コンテナとイテレータを使用してください。 – Downvoter
私はタグを気付かなかった。 VLAをC++コード(拡張機能、非標準)で使用しているのはなぜですか?あなたの質問は本当にCについてですか?明確化してください。それらは異なる言語です。 – StoryTeller