分段错误:使用双指针动态分配矩阵

Segmentation Fault: Dynamically allocating matrix using a double pointer

试图了解C中双指针的用法和内存分配

下面是我的代码:-

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

int main()
{
    
    printf("Enter rows and columns respectively: -\n");
    
    int rows, columns;
    scanf("%d%d", &rows, &columns);
    
    int **matrix;
    
    matrix = calloc(rows, sizeof(int));
    
    int i, j;
    for(i = 0; i < rows; i++)
    {
        matrix[i] = calloc(columns, sizeof(int));
    }
    
    printf("Enter your elements\n");
    
    for(i = 0; i < rows; i++)
    {
        for(j = 0; j < columns; j++)
        {
            scanf("%d", &matrix[i][j]);
        }
    }
    
    printf("Your elements are: -\n");
    
    for(i = 0; i < rows; i++)
    {
        for(j = 0; j < columns; j++)
        {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
    
    free(matrix);
    
    return 0;
}

得到Segmentation fault: 11后,在网上搜索了一下,发现不是这样写的:-

int **matrix;
matrix = calloc(rows, sizeof(int));

我应该写:-

int **matrix;
matrix = calloc(rows, sizeof(int*));

进行上述更改后,我的代码工作正常。

我的问题是:-

  1. What is the difference between sizeof(int) and sizeof(int *)?
  2. Don't both of them allocate 4 bytes? (int occupies 4 bytes and int* (which is noting but a pointer) also occupies 4 bytes?
  3. If both of them allocates the same space, then why was I getting a Segmentation fault in the first case?

Don't both of them allocate 4 bytes? (int occupies 4 bytes and int* (which is noting but a pointer) also occupies 4 bytes?

是什么让您认为指针是四个字节?在大多数现代(64 位)体系结构中,指向对象的指针是 8 个字节,而不是 4 个字节。

因此,一般来说sizeof(int) ≠ sizeof(int *)。但是你不能对可移植 C 代码中对象的大小做出很多假设,你绝对不能假设 sizeof(int) == 4sizeof(int*) == 8(也不是 4)。根据平台的不同,这些大小会有所不同。它们 可以 也具有相同的大小。你只是不能假设。

为了避免指针和指针大小之间的混淆,有些人(包括我在内)建议在分配的 sizeof 表达式中使用 对象名称 ,而不是类型姓名:

int **matrix = calloc(rows, sizeof *matrix);
// …
matrix[i] = calloc(columns, sizeof **matrix);

这清楚地表明了您要分配的内容。请注意 sizeof expr 不会 评估 expr;这很重要,因为表达式 *matrix**matrix 在分配内存之前是 无效的 — 引用未分配的指针将是未定义的行为。但是 sizeof 只确定了表达式的对象大小,而没有实际计算它。