Write Access Violation (ptr was nullptr), возвращая указатель в функцию, которая была использована для создания динамического массива [duplicate]

Добавить почтовый заголовок в функцию почты

$header = "From: noreply@example.com\r\n"; 
$header.= "MIME-Version: 1.0\r\n"; 
$header.= "Content-Type: text/html; charset=ISO-8859-1\r\n"; 
$header.= "X-Priority: 1\r\n"; 

$status = mail($to, $subject, $message, $header);

if($status)
{ 
    echo '<p>Your mail has been sent!</p>';
} else { 
    echo '<p>Something went wrong, Please try again!</p>'; 
}
31
задан Ian R. O'Brien 30 March 2016 в 15:05
поделиться

4 ответа

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

void foo(int **ptr) //pointer to pointer
{
    *ptr = new int[10]; //just for example, use RAII in a real world
}

или

void bar(int *& ptr) //reference to pointer (a bit confusing look)
{
    ptr = new int[10];
}
65
ответ дан Andrew 23 August 2018 в 00:31
поделиться
  • 1
    Но когда я пробую ваш подход, он падает на эту строку *targetBubble = bubbles[i];, и я передаю такой аргумент clickOnBubble(mousePos, bubbles, &targetBubble); – c0ntrol 7 August 2012 в 10:28
  • 2
    @ user1295618: какая ошибка вы видите? Возможно, я вне пределов досягаемости – Andrew 7 August 2012 в 10:35
  • 3
    Ошибка сегментации – c0ntrol 7 August 2012 в 10:41
  • 4
    @ user1295618: задайте новый вопрос и напишите свой новый код там. Потому что трудно сказать, в чем проблема, не видя ваш фактический код – Andrew 7 August 2012 в 10:42
  • 5
    Но второй подход работает, спасибо. – c0ntrol 7 August 2012 в 10:49

, если вы пишете

int b = 0;
foo(b);

int foo(int a)
{
  a = 1;
}

, вы не меняете 'b', потому что a является копией b

, если вы хотите изменить b, вам нужно будет передать адрес из b

int b = 0;
foo(&b);

int foo(int *a)
{
  *a = 1;
}

одинаково для указателей:

int* b = 0;
foo(b);

int foo(int* a)
{
  a = malloc(10);  // here you are just changing 
                   // what the copy of b is pointing to, 
                   // not what b is pointing to
}

, поэтому для изменения, где b указывает, чтобы передать адрес:

int* b = 0;
foo(&b);

int foo(int** a)
{
  *a = 1;  // here you changing what b is pointing to
}

hth

18
ответ дан Anders K. 23 August 2018 в 00:31
поделиться

Вы не можете изменить указатель, если вы не передадите его ссылкой (не const) или как двойной указатель. Передача по значению делает копию объекта, и любые изменения в объекте производятся копией, а не объектом. Вы можете изменить объект, на который указывает указатель, но не сам указатель, если вы проходите по значению.

Прочитайте этот вопрос, чтобы лучше понять различия в деталях . Когда пройти мимо ссылку и когда передать указатель в C ++?

6
ответ дан Community 23 August 2018 в 00:31
поделиться

Вы передаете указатель по значению.

Передайте ссылку на указатель, если вы хотите его обновить.

bool clickOnBubble(sf::Vector2i& mousePos, std::vector<Bubble *> bubbles, Bubble *& t)
21
ответ дан Daniel Daranas 23 August 2018 в 00:31
поделиться
  • 1
    +1. Первый ответ, который делает это правильно в контексте C ++. Ответы, предлагающие двунаправленные указатели, - это старая возможность сделать это. – paxdiablo 7 August 2012 в 10:02
Другие вопросы по тегам:

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