【问题标题】:Size of matrix not evaluating correctly [duplicate]矩阵大小未正确评估[重复]
【发布时间】:2015-05-11 01:43:52
【问题描述】:

我正在开发一个涉及生成随机图的邻接矩阵的 C 程序。这是源代码的sn-p:

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

#include "test.h"

int main()
{
    int **A = create_matrix(4, 3);
    destory_matrix(A);
    return 0;
}

int** create_matrix(int size, int seed)
{
    // Allocate space for matrix
    int **A = malloc(size * size * sizeof(int));

    for (int r = 0; r < size; r++) {
        A[r] = malloc(size * sizeof(int));
    }

    // Fill entries
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            A[i][j] = seed * (i + 1) * (j + 1);
        }
    }

    return A;
}

void destory_matrix(int **A)
{
    int size = sizeof(A[0]) / sizeof(int);

    for (int r = 0; r < size; r++) {
        free(A[r])
    }

    free(A);
}

这部分代码负责创建矩阵(create_matrix() 函数)和释放内存(destroy_matrix())。我正在查看destroy_matrix(),并注意到当传入一个 4x4 矩阵时,变量大小评估为 2,而不是 4。谁能解释为什么会发生这种情况?

【问题讨论】:

    标签: c memory malloc


    【解决方案1】:

    我认为您对sizeof 运算符有基本的误解。通常,它不能用于获取动态分配的复合对象的大小。 sizeof 运算符根据操作数的类型返回大小。在您的情况下,操作数的类型是int *。我猜你是在 64 位系统上运行的。所以sizeof any 指针是 8。因此,无论矩阵大小如何,size 变量都将始终为 2。

    【讨论】:

      【解决方案2】:

      应用于指针的sizeof 运算符返回指针类型的大小,而不是它碰巧指向的任何已分配内存的大小。

      这是 C 中数组类型和指针类型之间的主要区别之一(注意:数组可以衰减为指针)。 sizeof 应用于静态指定的数组类型(例如int foo[n];)将获得数组的大小(以字节为单位)。

      由于您的字长可能是 8 个字节(64 位),因此指针的大小将是 8 个字节,如果 sizeof(int) 是 4 个字节(32 位),则您有 8 / 4 = 2;

      如果您需要运行时大小的堆分配矩阵,则需要考虑其他方式来存储矩阵的维度,例如存储维度和指向分配内存的指针的结构。不过,最好完全避免可能的堆碎片。

      如果你有 C99,试试这个:

      int n = 4, m = 5;
      int (*A)[n] = malloc(m * sizeof A[0]));
      free(A);
      

      这会将int[n]m 长度数组分配为单个块,因此您可以使用size_t n = sizeof(A)/sizeof(A[0]); 来获得一维(n),但如果您愿意,您需要存储m正确迭代。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-08
        • 2021-08-25
        • 1970-01-01
        • 2020-02-16
        相关资源
        最近更新 更多