Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Вы передаете указатель значением, не ссылкой, таким образом независимо от того, что Вы делаете с прибытием в нечто, не будет иметь значение вне функции нечто. Поскольку 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;
}
Вы выделили прибытие в нечто, но то значение указателей хранится в стеке вызовов. Если Вы хотите сделать это, сделайте это как это:
void foo( int ** arr) {
*arr = (int *)malloc( sizeof(int) * 25 );
(*arr)[3] = 69;
}
И в основном, просто передайте указатель на нечто (как нечто (& прибытие))
нечто получает локальную копию международного указателя, выделяет память ему и утечки, что память, когда это выходит из объема.
Один способ зафиксировать это, чтобы заставить нечто возвращать указатель:
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 распечатанных, и следовательно свободный () отказывается работать. Вы удачливы, что не получили отказ сегментации при доступе к прибытию [3] основная внутренняя часть.
Вы не можете изменить значение своего аргумента (прибытие), если это не передается в ссылкой (&). В целом Вы хотели бы возвратить указатель, таким образом, Ваш метод должен быть:
arr=foo ();
Это - плохой амулет, чтобы попытаться повторно присвоить аргументы; я не рекомендую (&) решение.