我通常在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数组时,如何确保分配新内存? (如果这确实是我的问题)。
希望这个问题不是太复杂。请随时提问。
答案 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
和朋友分配内存。
假设n
是int
(实际上,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);