为什么当我这样做时,我会遇到段错误?我只是将值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);
}
答案 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,了解指针指针的内存分配是如何工作的。
答案 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)
相同,但数组中的值未初始化,因此您尝试取消引用未初始化的指针,这会产生未定义的行为。