为什么tab [i] [j] =" value"段错误

时间:2016-06-09 09:57:39

标签: c pointers tabs segmentation-fault int

为什么当我这样做时,我会遇到段错误?我只是将值5赋给我的int数组的第一个位置?

#include <stdlib.h>
int main()
{
int     **tab;
int     i;
int     j;

i = 0;
j = 0;
tab = (int **)malloc(sizeof(int *) * 100);
tab[i][j] = 5;
return(0);
}

4 个答案:

答案 0 :(得分:2)

因为您没有正确分配内存。您实际执行的操作是仅分配表的 。您尚未为 分配任何空间,但仍尝试访问它们,这将导致未定义的行为。为了解决这个问题,请更换部件:

tab = (int **)malloc(sizeof(int *) * 100);
tab[i][j] = 5;

with:

tab = malloc(sizeof(int *) * 100);
for (i = 0; i < 100; i++)
    tab[i] = malloc(sizeof(int) * NUM) ;   //where NUM is the size you want to allocate
tab[i][j] = 5;

看一下这个link,了解指针指针的内存分配是如何工作的。

另请参阅why you should not cast the result of malloc

答案 1 :(得分:2)

可以使用此分配内存。检查malloc的返回,当不再需要时,释放内存。

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

int main()
{
    int row = 23;
    int col = 100;
    int i = 0;
    int j = 0;
    int (*tab)[col] = NULL;
    if ( ( (tab) = malloc( sizeof(*tab) * row)) == NULL) {
        printf ( "malloc failed\n");
        return 1;
    }
    tab[i][j] = 5;
    free ( tab);
    return 0;
}

答案 2 :(得分:1)

您分配“矩阵”的第一部分(行)

您必须分配列,例如

#define ROWS 100
#define COLS 100

tab = malloc(sizeof(int *) * ROWS);
for (i = 0; i < ROWS; i++)
    tab[i] = malloc(sizeof(int) * COLS) ;   
tab[i][j] = 5;

并以相反顺序释放所有内容

for (i = 0; i < ROWS; i++)
    free(tab[i]);
free(tab);

答案 3 :(得分:0)

tab[i]*(tab + i)相同,但数组中的值未初始化,因此您尝试取消引用未初始化的指针,这会产生未定义的行为。