【问题标题】:Get size of a simulated array using malloc使用 malloc 获取模拟数组的大小
【发布时间】:2018-03-21 13:12:15
【问题描述】:

我有一个使用 malloc 指针的模拟二维数组,我想获取该数组的大小,因为 sizeof() 返回指针的大小。 我的代码(ANSI C):

void main(){
    int s1=10;
    int s2=15;
    int ** rack=(int**)malloc(s1*sizeof(int**));
    for(int i=0; i<s1; i++) rack[i]=(int*)malloc(s2*sizeof(int*));
}

我想要这样的功能(可能是系统,也可能是我自己做的):

size(rack)    //returns 10
size(rack[0]) //returns 15

提前致谢! (有关更多信息,我使用 GNU/Linux)

【问题讨论】:

  • 请注意pointer to pointer array is not really 2D array。此外,ANSI C 指的是旧的、过时的 C 版本;如果您使用的是 Linux,则很有可能升级到 C11。
  • 一个好习惯是不要将malloc 中的sizeof 使用类型,而是使用指针应该指向malloc(s1*sizeof *rack) 的对象。同样在 C 中,您不应该将malloc 和朋友的返回值强制转换。
  • 您在 malloc 中分配了错误的空间量
  • 如果给定一个指针,该指针使用malloc 返回的值分配/初始化,则没有(便携式)方法可以找出最初请求了多少内存。这些链接可能感兴趣:stackoverflow.com/a/28854641/4386427man7.org/linux/man-pages/man3/malloc_usable_size.3.htmlstackoverflow.com/questions/44581168/…
  • 我并不是说你不能,但是在 C 中,你分配内存并且你负责跟踪分配。没有一个简单的库函数可以告诉您之前在代码中为变量X 分配了多少内存。 (并且具有多个功能和范围,该信息可能在运行时不可用)

标签: c arrays pointers malloc dynamic-memory-allocation


【解决方案1】:

首先,您为二维数组分配内存的方式是错误的。您需要将其更改为:

void main(){
    int s1 = 10;
    int s2 = 15;
    int** rack = malloc(s1*sizeof(int*));
    if (rack == NULL)
        return;
    for(int i=0; i<s1; i++) {
        rack[i]=malloc(s2*sizeof(int));
        if (rack[i] == NULL)
            return;
    }

    ... 

    free(rack);
    return;
}

请记住始终check malloc's resultnot to cast malloc's result

为了获得数组的大小,您可以打印s1*s2*sizeof(int),因为您已经分配了指向ints1 指针,每个指针都包含s2ints。

【讨论】:

  • 请注意,您没有释放已分配的所有内存。
  • @Bob__ 我没有回答,因为我只回答了分配的部分。我以为 OP 释放了他的记忆,但向我们展示了一小部分。
  • 由于intsize_t 的范围不同,s1*s2*sizeof(int) 可以溢出,而sizeof(int)*s1*s2* 不会。 IAC,使用size_tint 更好地用于数组索引和大小。
猜你喜欢
  • 2014-12-26
  • 2021-05-05
  • 1970-01-01
  • 2012-08-21
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
  • 2016-03-06
  • 2011-05-03
相关资源
最近更新 更多