【问题标题】:Dynamically allocating variables in C在 C 中动态分配变量
【发布时间】:2012-03-03 15:33:58
【问题描述】:

我通常在 Objective-C 中工作,但现在我正在尝试集成一些我也不知道的 C 代码。

让我们从我的 Buffer 对象开始:

@interface Buffer : NSObject {

    int*  buffer_;
    int   numFrames_;
    int   idNumber_;
}

@property (nonatomic) int* buffer;
@property (nonatomic) int numFrames;
@property (nonatomic) int idNumber;

在另一个类中,我正在尝试动态创建 c 数组并将它们粘贴到我的缓冲区对象的缓冲区中。需要注意的是,我事先并不知道需要多少缓冲对象。

for (i=0; i<[arrayOfFlags count]; i++) {

    NSNumber *flagObject = (NSNumber*)[arrayOfFlags objectAtIndex:i];
    int flagInt = [flagObject integerValue];


    Buffer *snippetBuffer = [[Buffer alloc] init];
    int returnArray[44000];
    snippetBuffer.buffer = returnArray;
    snippetBuffer.numFrames = 44000;
    snippetBuffer.idNumber = i;

    int k;

    // NSLog(@"creating snippet buffer at flag %d", flagInt);
    for (k = 0; k < 44000; k++) {

        snippetBuffer.buffer[k] = // insert some values here. 
    }
}

当我运行此代码时,所有缓冲区对象都具有与要生成的最后一个相同的数据。我认为正在发生的事情是每次迭代都会覆盖 returnArray。

那么如何确保每次在循环中实例化 c 数组时都分配新内存? (如果这确实是我的问题)。

希望这个问题不要太复杂。请随时提出问题。

【问题讨论】:

    标签: objective-c c memory loops initialization


    【解决方案1】:
    int returnArray[44000];
    snippetBuffer.buffer = returnArray;
    

    这是对 snippetBuffer.buffer 指针的错误初始化,因为 returnArray 是一个局部变量,并在作用域结束时被销毁。

    改为使用

    snippetBuffer.buffer = (int*)malloc(44000*sizeof(int));
    

    完成后记得调用free释放内存。

    【讨论】:

      【解决方案2】:

      您正在调用堆栈上分配“returnArray” - 即函数的本地 - 而不是在主内存中。如果您希望分配的数组“转义”该函数并在其他地方使用,则需要显式分配内存:

      int* returnArray = (int *) malloc(44000 * sizeof (int));
      

      【讨论】:

        【解决方案3】:

        在 C 中,您为 malloc 和朋友分配内存。

        假设nint(实际上,size_t 更合适,但我们现在不要考虑这个)。 C 中没有像 int* foo[n]; 这样的东西。你可以这样做

        int* foo = (int*)malloc(n*sizeof(int));
        // Check that foo is not NULL.
        // Use foo.
        // When done:
        free(foo);
        

        【讨论】:

          猜你喜欢
          • 2014-07-12
          • 1970-01-01
          • 2014-10-06
          • 1970-01-01
          • 1970-01-01
          • 2017-03-11
          • 1970-01-01
          • 1970-01-01
          • 2018-12-29
          相关资源
          最近更新 更多