在C中动态分配变量

时间:2012-03-03 15:33:58

标签: objective-c c memory loops initialization

我通常在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数组时,如何确保分配新内存? (如果这确实是我的问题)。

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

3 个答案:

答案 0 :(得分:2)

int returnArray[44000];
snippetBuffer.buffer = returnArray;

这是snippetBuffer.buffer指针的错误初始化,因为returnArray是一个局部变量,并在范围的末尾被销毁。

改为使用

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

在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);