三行代码  ›  专栏  ›  技术社区  ›  Swarnim Khosla

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

  •  0
  • Swarnim Khosla  · 技术社区  · 1 年前

    试图了解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. sizeof(int)和sizeof(int*)之间有什么区别?
    2. 它们不是都分配了4个字节吗?(int占用4个字节,int* (它是nothing,但是是一个指针)也占用4个字节?
    3. 第一种情况下的分割错误?
    1 回复  |  直到 1 年前
        1
  •  1
  •   Konrad Rudolph    1 年前

    它们不是都分配了4个字节吗?(int占用4个字节,int*(它只是一个指针)也占用4个字节?

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

    因此,总的来说 sizeof(int) ≠ sizeof(int *) . 但是在可移植C代码中,你不能对对象的大小做很多假设,而且你也绝对不能这样假设 sizeof(int) == 4 ,或 sizeof(int*) == 8 4 ). 根据平台的不同,这些尺寸各不相同。他们 能够

    为了避免混淆指针和指针对象大小,有些人(包括我在内)建议使用 对象名称 sizeof

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

    这就清楚了 什么 你在试图分配。请注意 sizeof expr expr ;这很重要,因为 *matrix **matrix 在分配内存之前,延迟未分配指针将是未定义的行为。但是 大小