2016-05-01 2 views
1

私が書いたコードはOS Xでは問題なく動作しましたが、VS 2013コミュニティで実行したときに次のエラーが発生しました。malloc()と割り当て:OS Xでよく実行されるCコード。 Win 8.1ではなく

Unhandled exception at 0x001A3D22 in Myproject.exe: 0xC0000005: 
Access violation writing location 0x00000000. 

ここに問題のあるコードがあります。元のコードにはいくつかの行がありますが、以下のコードは同じエラーを生成します。

#include <stdio.h> 

int main(void){ 
    int **p; 
    p = (int **)malloc(sizeof(int *) * 5000); 
    for (int i = 0; i < 5000; i++) 
     p[i] = (int *)malloc(sizeof(int) * 5000 * 25); 

    for (int i = 0; i < 5000 * 25; i++) p[0][i] = 0; 
    for (int i = 1; i < 5000; i++) p[i][0] = 0;  //<- error on this line 

    printf("donw!\n"); 
    system("pause"); 
    return 0; 
} 

エラーが発生した状態です。 iとpは赤色に着色されています。

name  value       type 
    i   4118       int 
    p   0x00758fe8 {0x0075de48 {0}} int * * 
    p[0]  0x0075de48 {0}    int * 
    p[0][i]  0        int 
    p[i]  0x00000000 {???}    int * 

OSXとWindowsの違いは何ですか? OSXでは、gccでコードをコンパイルしました。

+1

'malloc()'の戻り値を確認しましたか?私の計算が正しければ、あなたはたくさんのメモリを割り当てています - 約2.5 GiBです。どのくらいのメモリをWindows上で使用できるかを判断することは可能ですか? 32ビット版または64ビット版(各プラットフォームでコンパイルしていますが、Macでのデフォルトは32ビットコンパイルを選択しない限り64ビットになります)。 –

+0

あなたのプログラムはたくさんのメモリを割り当てます。利用可能な領域がなくなった場合、mallocは0を返します。それを確認するのはあなたの責任です。これは、OSXとウィンドウの違いではなく、むしろ利用可能なメモリの問題です。 –

答えて

2

p[i]NULLの場合は、mallocが必要なメモリを割り当てられない可能性があります。それを検出するためのチェックを追加します。

p = (int **)malloc(sizeof(int *) * 5000); 
if (p == NULL) 
{ 
    // Deal with error. 
} 

for (int i = 0; i < 5000; i++) 
{ 
    p[i] = (int *)malloc(sizeof(int) * 5000 * 25); 
    if (p[i] == NULL) 
    { 
     // Deal with error 
    } 
} 
関連する問題