2012-03-03 3 views
0

Я обычно работаю в Objective-C, но теперь я пытаюсь интегрировать некоторый код C, который я тоже не знаю.Динамическое распределение переменных в C

Начнут с моим объектом буфера:

@interface Buffer : NSObject { 

    int* buffer_; 
    int numFrames_; 
    int idNumber_; 
} 

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

В другом классе я пытаюсь динамически создавать массивы гр и наклеить их в буфер моих объектов буфера. Следует отметить, что я не знаю, сколько буферов мне понадобится заранее.

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 в цикле? (Если это действительно моя проблема).

Надеюсь, что этот вопрос был не слишком сложным. Пожалуйста, не стесняйтесь задавать вопросы.

ответ

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

Это неправильная инициализация для snippetBuffer.buffer указателя, так как returnArray локальная переменная и разрушается в конце области.

Используйте вместо

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

Не забудьте позвонить free, чтобы освободить память после того, как вы сделали.

0

В C вы выделяете память malloc и друзьями.

Предположите, что n является int (действительно, a size_t является более уместным, но давайте не будем думать об этом сейчас). Там нет ничего, как int* foo[n]; в C. Вы вместо того, чтобы сделать

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

Вы выделяете «returnArray» в стеке вызовов, то есть локальный для функции, а не в основной памяти. Если вы хотите, чтобы выделенный массив «выходил» из функции и использовался в другом месте, вам необходимо явно выделить память:

int* returnArray = (int *) malloc(44000 * sizeof (int)); 
Смежные вопросы