簡體   English   中英

malloc動態內存分配過程中的分段錯誤

[英]segmentation fault in during dynamic memory allocation with malloc

這可能是一個非常愚蠢的問題。
我正在使用malloc來進行內存分配。
程序編譯很好但啟動時出現分段錯誤。
這是最小代碼:

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

int main()
{
    int row,col,i;
    int **mat;
    row = 3; //made row as static for testing
    col = 4; //made col as static for testing
    *mat = (int *)malloc(sizeof(int)*row);
    for (i=0;i<row;i++)
       mat[i] = (int *) malloc (sizeof(int)*col);
}

我用以下代碼編譯:gcc -ggdb test.c
在gdb上給出:

(gdb) run
Starting program: /slowfs/swe91/abjoshi/clients/fw_cl_for_seg_fault/a.out

Program received signal SIGSEGV, Segmentation fault.
0x00000000004004cc in main () at 1test.c:10
10          *mat = (int *)malloc(sizeof(int)*row);

注意:gcc版本4.5.2

常見的malloc習語如下:要分配由指針p指向的n元素的數組,請使用以下通用語法

p = malloc(n * sizeof *p);

這將幫助您避免代碼中的錯誤。 請注意這里的關鍵點:不要malloc的結果,也不要在sizeof下使用類型。 一般而言:盡可能避免在聲明之外的任何地方提及類型。

在您的情況下,第一次分配應該看起來像

mat = malloc(row * sizeof *mat);

循環內的分配應該如下

for (i = 0; i < row; ++i)
   mat[i] = malloc(col * sizeof *mat[i]);

這種方法的重要好處是代碼是獨立於類型的:在任何時候你都可以將mat的聲明從int **mat更改為,例如, double **mat ,但分配代碼將繼續保持有效 - 你不必在那里做任何改變。

代替

*mat = (int *)malloc(sizeof(int)*row);

我想你想要的

mat = (int **)malloc(sizeof(int *) * row);

實際上,您正在取消引用未初始化的mat。 在你尊重它之前,你需要malloc()mat。

您也可以將演員陣容從malloc中移除:

mat = malloc(sizeof(int *) * row);

以及sizeof(int *)引用:

mat = malloc( row * sizeof(*mat));

編譯器會用-Wall告訴它

$ gcc -Wall y.c
y.c: In function ‘main’:
y.c:14:1: warning: control reaches end of non-void function [-Wreturn-type]
y.c:11:8: warning: ‘mat’ is used uninitialized in this function [-Wuninitialized]

在行*mat = (int *) malloc(sizeof(int)*row); 你試圖取消引用墊子。 墊目前尚未初始化。

這是什么:

mat是一個雙指針,它是未初始化的(或NULL)。 當你取消引用它時:

*mat = (int *)malloc(sizeof(int)*row);

您正在取消引用NULL值並嘗試分配給它,從而導致分段錯誤。

首先使用指向(int *)指針列表的指針初始化mat。 然后單獨獲取列表中的每個指針並為每個指針分配(int)空間。

mat = (int *)malloc(cols*sizeof(int *));
for (i=0;i<cols;i++)
    mat[i] = malloc(rows*sizeof(int))

暫無
暫無

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

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