Malloc в вызове функции, кажется, становится освобожденным по возврату?

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

16
задан 3 revs, 2 users 90%Bee 4 May 2013 в 10:42
поделиться

5 ответов

Вы передаете указатель значением, не ссылкой, таким образом независимо от того, что Вы делаете с прибытием в нечто, не будет иметь значение вне функции нечто. Поскольку m_pGladiator записал, что один путь состоит в том, чтобы объявить ссылку на указатель как это (только возможный в C++ btw. C не знает о ссылках):

int main(int argc, char ** argv) {
  int * arr;

  foo(arr);
  printf("car[3]=%d\n",arr[3]);
  free (arr);
  return 1;
}

void foo(int * &arr ) {
  arr = (int*) malloc( sizeof(int)*25 );
  arr[3] = 69;
}

Другой (лучше, по моему скромному мнению) путь не состоит в том, чтобы передать указатель как аргумент, но возвратить указатель:

int main(int argc, char ** argv) {
  int * arr;

  arr = foo();
  printf("car[3]=%d\n",arr[3]);
  free (arr);
  return 1;
}

int * foo(void ) {
  int * arr;
  arr = (int*) malloc( sizeof(int)*25 );
  arr[3] = 69;
  return arr;
}

И можно передать указатель на указатель. Это - способ C передать ссылкой. Усложняет синтаксис немного, но хорошо - это - то, как C...

int main(int argc, char ** argv) {
  int * arr;

  foo(&arr);
  printf("car[3]=%d\n",arr[3]);
  free (arr);
  return 1;
}

void foo(int ** arr ) {
  (*arr) = (int*) malloc( sizeof(int)*25 );
  (*arr)[3] = 69;
}
47
ответ дан 30 November 2019 в 15:24
поделиться

Вы выделили прибытие в нечто, но то значение указателей хранится в стеке вызовов. Если Вы хотите сделать это, сделайте это как это:

void foo( int ** arr) {
    *arr = (int *)malloc( sizeof(int) * 25 );
    (*arr)[3] = 69;
}

И в основном, просто передайте указатель на нечто (как нечто (& прибытие))

6
ответ дан 30 November 2019 в 15:24
поделиться

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

Один способ зафиксировать это, чтобы заставить нечто возвращать указатель:

int * foo() {
  return (int*) malloc( sizeof(int)*25 );
}

int main() {
    int* arr = foo();
}

Другой должен передать нечто указатель на указатель

void foo(int ** arr) {
   *arr = malloc(...);
}

int main() {
    foo(&arr);
}

В C++, более просто изменить нечто для принятия ссылки на указатель. Единственное изменение, в котором Вы нуждаетесь в C++, должно изменить нечто на

void foo(int * & arr)
3
ответ дан 30 November 2019 в 15:24
поделиться

Начиная с Вашего передают указатель значением, указатель прибытия, внутри основной, не указывает на выделенную память. Это означает две вещи: у Вас есть самостоятельно утечка памяти (Нет, память не освобождена после того, как функциональное нечто завершается), и когда Вы получаете доступ к указателю прибытия, внутри основному, Вы получаете доступ к некоторому произвольному диапазону памяти, следовательно Вы не получаете 3 распечатанных, и следовательно свободный () отказывается работать. Вы удачливы, что не получили отказ сегментации при доступе к прибытию [3] основная внутренняя часть.

1
ответ дан 30 November 2019 в 15:24
поделиться

Вы не можете изменить значение своего аргумента (прибытие), если это не передается в ссылкой (&). В целом Вы хотели бы возвратить указатель, таким образом, Ваш метод должен быть:

arr=foo ();

Это - плохой амулет, чтобы попытаться повторно присвоить аргументы; я не рекомендую (&) решение.

0
ответ дан 30 November 2019 в 15:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: