【问题标题】:How do I know how many slots are in an array after mallocing it?分配后如何知道数组中有多少个插槽?
【发布时间】:2014-02-06 22:55:11
【问题描述】:
#include <stdlib.h>
#include <stdio.h>

#define MAX_NUM 65536
struct Test{
int t;
char args[16][65];

};


int main(int argc, char ** argv) {
//
struct Test *array = malloc(MAX_NUM * sizeof(struct Test*));
printf("%d", sizeof(*array));
for(int i = 0; i < sizeof(*array); i++) {
    printf("%d", i);
    printf(" ");
    array[i].t = 0;

}
array[421].t = 5;
printf("%d", array[421].t);
free(array);
return 0;

}

您好,我如何确定分配后的数组有多少个插槽?当我打印 sizeof(*array) 时,我得到数字 1044,但是当我尝试运行循环并在每个插槽中设置一个测试值时,我在段错误之前只能达到 282。 sizeof 和 malloc 有什么区别?为什么我的数组在大小为 1044 时只接受高达 282 的值?为什么我可以在 421 处编辑一个插槽,但在我的循环中它的段错误高达 282?谢谢

【问题讨论】:

  • 什么是struct Key。这段代码编译时没有警告吗
  • 哎呀,改成 struct Test。
  • 我不确定table 是什么所以我不知道sizeof(*table) 应该做什么。
  • 它已经写在其中一个答案中,但您可能希望在对 malloc 的调用中使用 sizeof(struct Test) 而不是 sizeof(struct Test*)
  • @m24p 那是*数组。

标签: c arrays segmentation-fault malloc sizeof


【解决方案1】:

我想你是说

struct Test *array = malloc(MAX_NUM * sizeof(struct Test));

还是我错过了什么?

【讨论】:

  • 是的!这使它达到了所有 1024 个插槽。我试图将 array[1045].t 中的一个值设置为 = 5,它返回为 0 而不是出现分段错误。这是否意味着我为数组分配了比 1024 更多的点?
  • @wheatfairies:越界访问数组是 undefined 行为。运行时没有义务给你一个段错误。它可能通过擦除硬盘或将所有文件通过电子邮件发送到玻利维亚来指示失败。它可以做 anythingnothing。如果你什么都没观察到,这意味着你今天很幸运。
  • @EricLippert 我听说过 C 让你无意中越界并造成可怕后果的说法,我一定不会再把内存越界弄乱了。
  • @wheatfairies:C 不仅可以让你在脚上开枪,它还可以在没有安全装置的情况下将上膛的枪交给你,并给你足够的绳索让你在讨价还价时上吊。 :-)
  • +1 进行更正@OP:也考虑不同的风格。而不是type *var = malloc(N * sizeof(type)),试试type *var = malloc(N * sizeof *var)
【解决方案2】:

对于静态分配的数组,可以使用sizeof(array)/sizeof(*array)

  • array占用的内存总量为sizeof(array)

  • 单个条目占用的内存量为sizeof(*array)

  • 因此,array 中的条目数为sizeof(array)/sizeof(*array)

但是,对于动态分配的数组,您必须使用 MAX_NUM 的值,因为 array 是一个指针,因此 sizeof(array) = 指针的大小,即 4 或 8 个字节(取决于在您的系统上)。

【讨论】:

  • 这对我来说返回为 0,但如果我把它作为 sizeof(*array)/sizeof(array) 它返回 130。
  • 如果数组中没有任何内容,那么 sizeof(array)/sizeof(*array) 将读取 0?
  • 对于动态分配的数组(例如您的问题中的那个),您将不得不使用 MAX_NUM 的值。
  • 不,sizeof(array) 在这种情况下是指针的大小,取决于您的系统,为 4 或 8 个字节。
【解决方案3】:

malloc 错误:您必须使用 sizeof(struct Test) 而不使用 *。 您还应该使用 MAX_NUM 作为迭代次数。

sizeof(*array) 返回数组第一个元素的大小所以 sizeof(struct Test),而不是数组的长度。

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

#define MAX_NUM 65536
struct Test{
int t;
char args[16][65];

};


int main(int argc, char ** argv) {
//Changed Key to Test type
struct Test *array = (Struct Test*)malloc(MAX_NUM * sizeof(struct Test));
printf("%d", sizeof(*array));
for(int i = 0; i < MAX_NUM; i++) {
    printf("%d", i);
    printf(" ");
    array[i].t = 0;

}
array[421].t = 5;
printf("%d", array[421].t);
free(array);
return 0;

}

【讨论】:

  • 所以 MAX_UID 是我拥有的插槽数。我从那开始就遇到了一些错误,但现在似乎可以工作了,谢谢。
猜你喜欢
  • 2014-05-20
  • 2020-02-11
  • 1970-01-01
  • 1970-01-01
  • 2020-12-25
  • 1970-01-01
  • 2017-03-17
  • 2018-06-17
  • 2017-12-04
相关资源
最近更新 更多