Функция возвращает указатель Ошибка размещения

0

Я пытаюсь создать указатель на динамический массив и, следовательно, нужна функция, которая принимает размер массива и возвращает указатель. Тем не менее, я получаю ошибку каждый раз, когда я это делаю. Сама функция не дает ошибок, но распределение делает.

Может кто-нибудь указать, что может быть неправильным? Я читал много страниц в Интернете, но, похоже, пока не понял. Это очень поможет!

Изменение: Обновлен код:

 int *ReturnBitVector(int bitvector_size); //static 
 int *ReturnBitVector(int bitvector_size) //static
{
   int *bitvector = malloc((bitvector_size*1024*8)*sizeof *bitvector);
   return bitvector; 
}
int* BV = (int*)ReturnBitVector; 

if(BV == NULL){ //error here!
    perror("error in allocating memory.\n");
}

Ошибка, которую я получаю:

join.c:71: error: expected identifier or ‘(†before ‘ifâ€
  • 0
    Сравните типы того, что вы назначаете, и назначаемое значение.
  • 1
    Это даже не скомпилируется. Ну, во всяком случае, не на современном компиляторе.
Показать ещё 4 комментария
Теги:
pointers

3 ответа

4

Во-первых, вы разыменовали указатель, исправив ниже:

int* BV; BV = ReturnBitVector(1024);

Во-вторых, вы забыли указать тип параметра в определении функции. Разве вы не должны просто скопировать вставку заголовка 2 строки выше?

  • 0
    Здравствуй. Я получаю разные ошибки, когда следую тому, что вы предлагаете: join.c: 70: ошибка: конфликтующие типы для BV join.c: 69: ошибка: предыдущее объявление BB было здесь join.c : 70: предупреждение: инициализация делает целое число из указателя без приведения соединения. C: 70: ошибка: элемент инициализатора не является константой
  • 0
    Прочитайте мой второй абзац из ответа снова. Ваше определение функции ReturnBitVector () отличается от объявления. Вы забыли указать, что ввод является int. Компилятор считает, что вы пытаетесь переопределить эту функцию.
Показать ещё 2 комментария
1
int* BV;
BV = *ReturnBitVector(1024);

Функция ReturnBitVector возвращает значение типа int *. Вы разыскиваете эту точку, которая вычисляет целое число, а затем присваивает этому целочисленному значению значение BV которое имеет тип int * - другой тип. Компилятор неявно бросает целочисленный тип в тип указателя перед его назначением и испускает предупреждение -

join.c:69: warning: initialization makes pointer from integer without a cast

Вы пропустили тип параметра в определении функции. Кроме того, не делайте результат malloc. Прочтите это - Я делаю результат malloc? Я предлагаю следующие изменения:

// function declaration
int *ReturnBitVector(int bitvector_size);

// function definition
int *ReturnBitVector(int bitvector_size) 
{
   int *bitvector = malloc((bitvector_size*1024) * sizeof *bitvector);
   return bitvector;
}

// call the function

int *BV = ReturnBitVector(1024);
// check for NULL
if(BV == NULL) {
    perror("error in allocating memory.\n");
    // handle it
}

// do stuff with BV

free(BV);
BV = NULL;
  • 0
    Привет. Я получаю следующую ошибку. Я думаю, что мой компилятор C, ошибка, которую я получаю: join.c: 65: предупреждение: инициализация из несовместимого типа указателя join.c: 68: ошибка: ожидаемый идентификатор или (перед тем, как использовать ™
  • 0
    Я думаю, что значение BV не распределяется правильно, хотя это не дает больше ошибок.
0

Проблема заключается в вашей функции. Аргумент, который он принимает (bitvector_size), не имеет типа. Попробуйте так:

int *ReturnBitVector(int bitvector_size) //static
{
    int *bitvector;
    //bitvector   = new int[bitvector_size*1024*8];
    bitvector   = (int*) malloc(bitvector_size*1024*8);

    return bitvector;
}

int* BV;
BV = *ReturnBitVector(1024);
  • 0
    Привет. Когда я делаю это, это не дает ошибки. Но я хочу посмотреть, является ли BV нулевым, и эта команда дает ошибку. if (BV == NULL) {.. ошибка печати ..}; Есть ли у вас какие-либо идеи?
  • 0
    Причина, по которой (BV == NULL) возвращает ошибку, заключается в том, что BV еще не был назначен. Когда вы объявляете указатель, вы должны назначить ему что-то. Либо адрес в памяти, либо NULL. Когда вы объявляете int * BV, он никуда не указывает. Если вы отлаживаете в Visual Studio, int * BV будет иметь значение 0xCCCCCCCC (если ваше приложение 32-битное). Какую проблему вы пытаетесь решить?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню