Динамическое размещение переменных в C - PullRequest
0 голосов
/ 03 марта 2012

Я обычно работаю в 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 перезаписывается на каждой итерации.

Итак, как мне гарантировать, что новая память выделяется каждый раз, когда я создаю экземпляр массива ac ​​в цикле?(Если это действительно моя проблема).

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

Ответы [ 3 ]

2 голосов
/ 03 марта 2012
int returnArray[44000];
snippetBuffer.buffer = returnArray;

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

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

1 голос
/ 03 марта 2012

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

int* returnArray = (int *) malloc(44000 * sizeof (int));
0 голосов
/ 03 марта 2012

В 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);
...