【问题标题】:Segmentation Fault: Dynamically allocating matrix using a double pointer分段错误:使用双指针动态分配矩阵
【发布时间】:2021-02-22 06:45:42
【问题描述】:

试图了解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* (注意的不过是一个指针)也占4个字节?
  3. 如果它们都分配相同的空间,那为什么我得到一个 第一种情况下的分段错误?

【问题讨论】:

  • 指针并不总是 4 个字节。它们是 64 位二进制文​​件中的 8 个字节。只需打印出sizeof(int *) 亲自查看。

标签: c pointers matrix dynamic-memory-allocation sizeof


【解决方案1】:

他们不是都分配4个字节吗? (int占4个字节,int*(注意只是一个指针)也占4个字节?

是什么让你认为指针是四个字节?在大多数现代(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 只确定表达式的对象大小,而没有实际评估它。

【讨论】:

  • 最好补充一下sizeof(int) == 4sizeof(int *) == 8(肯定是sizeof(int *) == 4)都是错误的假设一般来说,因为C 标准没有指定大多数类型的大小。
  • sizeof如何在不计算的情况下确定表达式的对象大小?
  • @SwarnimKhosla:sizeof 运算符在编译时进行评估,除非其操作数是 VLA。编译器知道sizeof(*x) 在编译时应该是什么,因为它知道*x 的类型。
  • @Peter 我的大学老师告诉我们pointer sizeint size 是一样的。也许他的意思是32 bitsystems?
猜你喜欢
  • 2013-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多