c语言 - 为什么 tab[i][j] = "value"段错误



为什么当我这样做时,我得到一个段错误?我只是把值 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) 相同,但数组中的值未初始化,因此您正在尝试取消引用未初始化的指针,这会产生未定义的行为。

相关内容

  • 没有找到相关文章

最新更新