【问题标题】:array of pointers allocation指针分配数组
【发布时间】:2010-12-28 18:55:34
【问题描述】:

typedef 结构 { 结构表**符号; // 堆栈数组 诠释顶部; //顶部元素的索引 整数大小; //最大栈大小 }堆栈;

void *createStack(int size)
{
  stack *stck;
  stck = (stack *) malloc(sizeof(stack));

  stck->symbols  = ....

  stck->size = size;
  stck->top = -1;
  printf("stack is created --> size is : %d \n",size);
}

这里我需要分配堆栈的符号数组,它是“...”,但我不知道它的语法,请帮助:)

【问题讨论】:

  • 别忘了检查mallocs 是否成功!
  • 如果您在编译时知道确切的大小,请避免使用 malloc。数组有多大?

标签: c arrays pointers allocation


【解决方案1】:
(struct table **)malloc(size * sizeof(struct table*));

但前提是您想一次性预先分配所有空间。如果您想随时分配更多,可以从小于 size 的内容开始,并在空间不足时在 push() 函数中分配更多。

【讨论】:

    【解决方案2】:
    malloc(size * sizeof(struct table*));
    

    【讨论】:

    • 可能希望包括演员表。
    • 不需要在 C 中显式转换。
    • 我的错 :)... 那时只有我喜欢直言不讳。
    • 在 C 中显式转换 malloc 的返回值可以隐藏错误(例如忽略#include stdlib.h)。避免这样做。
    【解决方案3】:

    符号是指向结构表指针的一维数组还是结构表的二维数组?

    stck->symbols = malloc(sizeof *(stck->symbols) * numberOfElements);
    

    对于numberOfElements 的任何值。假设 stck->symbols 的类型是 struct table **,那么表达式 *(stck->symbols) 的类型将是 struct table *。你也可以写

    malloc(sizeof (struct table*) * numberOfElements);
    

    但我更喜欢前一种方法,因为它可以最大程度地减少您必须记住类型的位置。

    因为这是 C,你确实不需要需要转换malloc() 的结果,这样做被认为是不好的做法;如果您忘记包含 stdlib.h 或在范围内没有 malloc() 的原型,则强制转换将抑制警告您注意问题的警告(尽管由于 C99 不再允许隐式 int 类型,这可能不再是一个问题)。

    【讨论】:

      【解决方案4】:
      stck->symbols  = baseaddress = malloc(...required total size...);
      
      int nextDataLocation = baseAddress + numberOfRows*sizeof(void*);
      
      for(int i=0; i<numberOfLines; i++)
      {
          stck->symbols[i] = nextDataLocation;
          ..copy string i to address stck->symbols[i]...
          nextDataLocation += lengthOfString[i];
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多