C 为什么制表符[i][j]=";“价值”;断层

C 为什么制表符[i][j]=";“价值”;断层,c,pointers,tabs,segmentation-fault,int,C,Pointers,Tabs,Segmentation Fault,Int,为什么当我这么做的时候我会犯错误?我只是给int数组的第一个位置赋值5 #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); } #包括 int main() { int**选项卡; int i; int j; i=0; j=0;

为什么当我这么做的时候我会犯错误?我只是给int数组的第一个位置赋值5

#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);
}
#包括
int main()
{
int**选项卡;
int i;
int j;
i=0;
j=0;
tab=(int**)malloc(sizeof(int*)*100);
表[i][j]=5;
返回(0);
}

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

因为您没有正确分配内存。实际上,您只分配表中的行。您尚未为分配任何空间,但仍尝试访问它们,这将导致未定义的行为。要固定它,请更换零件:

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;
tab=malloc(sizeof(int*)*100);
对于(i=0;i<100;i++)
tab[i]=malloc(sizeof(int)*NUM)//其中NUM是要分配的大小
表[i][j]=5;
看看这个,了解一下指针到指针的内存分配是如何工作的



另外,请参见。

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

然后必须分配列,例如

#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;
#定义行100
#定义COLS 100
tab=malloc(sizeof(int*)*行);
对于(i=0;i
最后按相反的顺序释放所有

for (i = 0; i < ROWS; i++)
    free(tab[i]);
free(tab);
(i=0;i 自由(表[i]); 免费(标签);
内存可以通过此配置进行分配。检查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;
}
#包括
#包括
int main()
{
int行=23;
int col=100;
int i=0;
int j=0;
int(*tab)[col]=NULL;
如果((制表符)=malloc(sizeof(*制表符)*行))==NULL){
printf(“malloc失败\n”);
返回1;
}
表[i][j]=5;
免费(标签);
返回0;
}

对于二维阵列,使用此方法始终是个坏主意@Lundin肯定是我写的+1,但OP没有说它想要2D矩阵,我猜是的。我的答案基于指针到指针的分配。我的意思是:“矩阵”,每行的列宽度可变这里重要的一点是,我们必须阻止人们教授这种指针到指针的方法。大多数新手在真正需要2D数组时滥用它,这完全是胡说八道。@Lundin我同意。我将在将来应用这种原理。对于2D阵列,使用这种方法总是一个坏主意。你提供的链接也会转到一些业余爱好者的网站。。。“我不会看的。”伦丁的OP使用了动态内存分配,所以我继续他的方法。至于链接,它可能是业余的,但我发现它很容易理解和解释。我没有说他不应该使用动态分配,我说他不应该分配一个分段指针,指向散落在堆中的指针,毫无理由。而他只需要一个2D数组。这个链接可能很容易理解,但内容不正确,而且教人坏习惯。请再说一遍。@Lundin谢谢你给我发了你的回复,我会看一看。