1

こんにちは私はこの質問があります:フロート配列にmallocでメモリを割り当てると、要求しているより多くのスペースが割り当てられるのはなぜですか?たとえば、このコードでは、10個の「セル」フロート配列を割り当てようとしていますが、他のセルにアクセスしようとすると、セグメンテーション違反エラーは返されません。

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

float *fk_array;

int main(int argc, char** argv){


    fk_array = (float *) malloc(10 * sizeof(float));
    int i;
    fk_array[9] = 2.23;
    fk_array[15] = 0.3;
    for(i = 0; i<20 ; i++)
        printf("%f\n",fk_array[i]);
    free(fk_array);

    return 1;
}

それは私を返します:

0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
2.230000
0.000000
0.000000
0.000000
0.000000
0.000000
0.300000
0.000000
0.000000
0.000000
0.000000

どこが間違っているの?

4

4 に答える 4

5

割り当てアルゴリズムによっては、要求よりも多くが割り当てられる可能性はほとんどありません。ただし、そのメモリへのアクセスは未定義の動作です。

于 2013-02-17T16:16:35.563 に答える
4

を呼び出すときmallocに、サイズや他の割り当てられたブロックに関する情報など、割り当てられたブロックに関するメタデータを格納するために追加のスペースが使用される場合があります。実装では、割り当てられたブロックを特定の間隔(たとえば、4バイトまたは8バイトの倍数)にすることを好む場合があります。ただし、呼び出すたびに一貫しているスペースの量に依存するべきではありませんmalloc。特に要求したものだけを使用してください。そうしないと、他の重要な情報を上書きしている可能性があります。

詳細については、次の質問に対する回答を参照してください。

于 2013-02-17T16:25:04.417 に答える
1

ヒープメモリの割り当てが、アドレスを長い境界、クワッド境界、またはその他の境界に揃える必要があるという特定のプロセッサルールに該当しない場合でも、驚くことはありません。

したがって、100バイトのヒープスペースを要求した場合、OSは、プロセッサのアライメント要件を満たすために要求したよりも多くを返す可能性があります。ただし、100バイトを超えるアクセスは未定義と見なされ、望ましくない多くの奇妙な動作が発生する可能性があります。

于 2013-02-17T16:30:32.943 に答える
1

読み取りまたは書き込みが間違ったページにある場合にのみ、セグメンテーション違反が発生する可能性があります。通常、ページは4KiBです。

システムコールはmalloc()要求よりも少し多くのスペースを予約する可能性があり、簿記のためにブロックの前に数ワードのメモリを予約しますが、アクセス時にプログラムが強制終了されfk_array[15]ないということは、予約されたブロックの外部にアクセスしなかったことを意味しませんそれのための。おそらくそうだったでしょう、OSはそれに気づかなかっただけです。割り当て後に別の配列を割り当てた場合fk_array、それが変更されていることに気付く機会があります。

于 2013-02-17T17:25:21.313 に答える