为什么当我这样做时,我得到一个段错误?我只是把值 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);
}
因为您没有正确分配内存。您实际所做的是仅分配表中的行。您尚未为列分配任何空间,但仍尝试访问它们,这将导致未定义的行为。为了修复它,更换零件:
tab = (int **)malloc(sizeof(int *) * 100);
tab[i][j] = 5;
跟:
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;
查看此链接以了解指针到指针的内存分配的工作原理。
另外,请参阅为什么不应强制转换 malloc 的结果。
内存可以用这个来分配。检查 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 failedn");
return 1;
}
tab[i][j] = 5;
free ( tab);
return 0;
}
你分配了"矩阵"的第一部分(行)
然后,您必须分配列,例如
#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);
tab[i]
与 *(tab + i)
相同,但数组中的值未初始化,因此您正在尝试取消引用未初始化的指针,这会产生未定义的行为。