簡體   English   中英

C 中的動態 Memory 分配(返回值 3221225477 & 分段錯誤:11)

[英]Dynamic Memory Allocation in C ( return value 3221225477 & Segmentation fault: 11 )

誰能解釋下面的代碼有什么問題? 如果我將“line”變量指定為 1、2、3 或 4,它會正確運行。 但是在 4 之后它只是正確顯示了行數,列數不正確。

windows 上 dev-c/c++ 的 output >> “返回值 3221225477”

Mac上gcc的output >>“分段錯誤:11”

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

int main(){

int **matris;
int size;
int i, j;

printf( "Size >> " );
scanf( "%d", &size );

matris = (int **)malloc( size * sizeof(int) );

if( matris == NULL )
    printf( "It's required more memory'!" );

for( i = 0; i < size; i++ ) {
    matris[i] = malloc( size * sizeof(int) );
    if( matris[i] == NULL )
        printf( "It's required more memory'!!" );
}

for( i = 0; i < size; i++ ) {
    for( j = 0; j < size; j++ ){    
        matris[i][j]=i+1;
        printf( "%d ", matris[i][j] );
    }
    printf( "\n" );
}


for( i = 0; i < size; i++ ) {
    free( matris[i] );
}

free( matris );

return 0;
}
matris = (int **)malloc( size * sizeof(int) );

特別是( size * sizeof(int) )是錯誤的。 您需要為int* (指向int的指針)類型的對象分配 memory ,而不是int

如果您的實現中的sizeof(int) < sizeof(int*) -> 已翻譯:指向int的類型指針的 object 的大小大於int類型的 object 的大小,這很常見。

然后您會遇到分段錯誤,因為您在以下代碼中訪問了超出指針數組矩陣邊界的matris

利用:

matris = malloc ( sizeof(int*) * size );

甚至更好

matris = malloc ( sizeof(*matris) * size );

旁注:

  • 您不需要強制返回malloc() 返回的指針會自動對齊。 我要轉換 malloc 的結果嗎?

  • sizeof(*matris)需要較少的維護,如果matris類型和指向對象發生變化,則更安全。

  • 首先設置sizeof操作以確保size_t算術,因為sizeint類型。

matris = (int **)malloc( size * sizeof(int) ); 不正確,因為您要創建一個 int 指針數組而不是 int。 int更改為int*有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM