0

私はオンラインコードスクールで簡単なアルゴリズムに取り組んでいます。次のアルゴリズムは私のXcodeコンソールでは問題なく機能しますが、オンラインプラットフォームはメモリがオーバーフローしていることを出力します。次のコードは、株式のスクリーニングを扱います。(最初はmalloc動的割り当てを使用しましたが、このメッセージの後、単純な配列を使用しました。以下を参照してください)。

N個の製品の在庫があるとします。初期ストックがサイズNの1次元配列(c[i], i between 0 and N-1)によって設定されているとします。ここで、M個​​の操作があり、それぞれが2つのエントリ(製品のインデックスと入力された製品の数)で表されているとします。結果は、在庫の各製品の最終状態を出力します。次に例を示します。

入力:

3(製品数)4 6 3(製品「1」の4項目、製品「2」の6項目、...)2(操作数)2 3(製品「2」の3要素多い)1 -1(1要素から製品「1」を引いたもの)

出力:

3(製品「1」の左4-1)9(製品「2」の左6 + 3)3(製品「3」の左)

これが私のコードです:

#include <stdio.h>
#include <stdlib.h>


int main()
{   int i,j,N,M;
    //Number of products
    scanf("%d",&N);
    //Initial stock of each product
    int c[N];
    //Input if the user
    for (i = 0; i < N; i++) {
        scanf("%d", &c[i]);}
    //Outputs's result
    int res[N];
    //Initializing the output res
    for (i = 0; i < N; i++) {
        res[i] = c[i];}
    //Number of operations
    scanf("%d",&M);
    //Each operation represented by the index of the product, and the number elements of the        //latter
    int d[M][2];
    //A loop to update at each step the stock
    for (i = 0; i < M; i++) {
        scanf("%d%d", &d[i][0],&d[i][1]);}
    for(i=0;i<M;i++){
                res[d[i][0]-1] = res[d[i][0]-1] + d[i][1];}
    //Printing the result
    for(i=0;i<N;i++){
        printf("%d ",res[i]);}
}

誰かアイデアがありますか?

4

1 に答える 1

3

このループで製品インデックスを読み込むときに、製品インデックスの範囲をチェックしません。

for (i = 0; i < M; i++) { scanf("%d%d", &d[i][0],&d[i][1]);}

したがって、誰かが範囲外の製品インデックスを入力すると、プログラムは res 配列の末尾を超えてインデックスを作成します。

于 2012-10-23T18:36:00.220 に答える