Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 可靠地访问指针记帐数据_C_Pointers - Fatal编程技术网

C 可靠地访问指针记帐数据

C 可靠地访问指针记帐数据,c,pointers,C,Pointers,我已经读到:当一个人有一些内存分配用指针表示,比如 float (*ptr)[10]=malloc(sizeof(float)*100) 对于10x10阵列,ptr有一个“头”,上面有“记帐”信息,告诉您“步长”和“步长”什么的,这样您就可以正确地执行指针算法并使用free等等 是否有一个一致的(不依赖于架构)和可靠的(定义的行为)可以让用户获得这些信息 我在其他地方读到过,当有强制转换和动态内存分配时,跟踪数组长度的实际方法是手动分配一个插槽来存储大小。这自然让我相信我的问题的答案是“不”,

我已经读到:当一个人有一些内存分配用指针表示,比如

float (*ptr)[10]=malloc(sizeof(float)*100)
对于10x10阵列,ptr有一个“头”,上面有“记帐”信息,告诉您“步长”和“步长”什么的,这样您就可以正确地执行指针算法并使用
free
等等

是否有一个一致的(不依赖于架构)和可靠的(定义的行为)可以让用户获得这些信息

我在其他地方读到过,当有强制转换和动态内存分配时,跟踪数组长度的实际方法是手动分配一个插槽来存储大小。这自然让我相信我的问题的答案是“不”,但我想我还是不要做假设,否则我会有自己的内存泄漏。

将评论转换为答案


没有定义的标准方法来获取“分配内存块的大小”。每个实现都必须有一种方法来知道它分配的每个块的大小,但是使用该实现的程序员无法知道(通常)大小

所以它依赖于一些东西,但是如果所有的东西都知道,系统,架构,编译器,你是说没有资源来找出内存中的东西是如何格式化的

没有标准(无论是法律上的还是事实上的标准)的方法来获取关于所分配内存块大小的信息。除此之外,库分配的大小通常大于请求的大小(当然是因为内务数据,但即使是数据部分也可能被四舍五入到8的倍数或16的倍数)-代码应该报告请求的大小还是分配的大小

同样,开源系统的一个选择是查看C库对
malloc()
free()
的实现,以了解它的功能,并设计一种机制为程序员提供答案。然而,任何这样的研究都是针对该系统的——不同的系统通常会有不同的做法——如果该系统是一个封闭源代码系统,那么整个想法就会遇到障碍。

将评论转化为答案


没有定义的标准方法来获取“分配内存块的大小”。每个实现都必须有一种方法来知道它分配的每个块的大小,但是使用该实现的程序员无法知道(通常)大小

所以它依赖于一些东西,但是如果所有的东西都知道,系统,架构,编译器,你是说没有资源来找出内存中的东西是如何格式化的

没有标准(无论是法律上的还是事实上的标准)的方法来获取关于所分配内存块大小的信息。除此之外,库分配的大小通常大于请求的大小(当然是因为内务数据,但即使是数据部分也可能被四舍五入到8的倍数或16的倍数)-代码应该报告请求的大小还是分配的大小


同样,开源系统的一个选择是查看C库对
malloc()
free()
的实现,以了解它的功能,并设计一种机制为程序员提供答案。然而,任何这样的研究都是针对该系统的,不同的系统通常会做得不同,如果C++是一个封闭的源系统,整个想法就变成了一个石墙。但是,你必须写C,因为如果你使用C++,你需要一个演员。不要垃圾邮件标签- C++是一种与C语言非常不同的语言(C语言和这两种语言不同,尽管现在的问题上没有C标签,所以你没问题)。没有定义标准的方法来获得分配内存块的大小。每个实现都必须有一种方法,但是程序员无法使用实现来了解大小(一般)。@ JoaaNehan-LeffFER只假定系统比我Didok更了解3个建议标签——有趣的是C和C++都被建议。请以后不要接受那个建议。我不知道这是否值得一提,因为MSO(元堆栈溢出)-这对我们经常使用C和/或C++标签的人来说是没有帮助的(这是一个非常常见的问题抱怨,但我不知道系统提出了建议)。请添加一个支持投票。如果你正在写C++,不要使用<代码> MalCube()< /C>。但是,你必须写C,因为如果你使用C++,你需要一个演员。不要垃圾邮件标签- C++是一种与C语言非常不同的语言(C语言和这两种语言不同,尽管现在的问题上没有C标签,所以你没问题)。没有定义标准的方法来获得分配内存块的大小。每个实现都必须有一种方法,但是程序员无法使用实现来了解大小(一般)。@ JoaaNehan-LeffFER只假定系统比我Didok更了解3个建议标签——有趣的是C和C++都被建议。请以后不要接受那个建议。我不知道这是否值得一提,因为MSO(元堆栈溢出)-这对我们经常使用C和/或C++标签的人来说是没有帮助的(这是一个非常常见的问题抱怨,但我不知道系统提出了建议)。请投赞成票。