Один метод вызывает segfault, другой нет.В чем разница? - PullRequest
0 голосов
/ 22 мая 2018

Мой исходный код содержит сегмент, подобный следующему:

double ****A;

my_function(A);

, который выдает ошибку segfault в my_function.

Однако, когда я заменяю его на:

double ***A;

my_function(&A);

тогда my_function работает.Я бы подумал, что my_function увидит один и тот же аргумент в обоих случаях.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Это: double ****A; не указывает ни на что.Это висячий указатель с неизвестным значением.

Это: double ***A; double ****B = &A;, что-то вроде того, что делает вызов вашей функции, указывает B на хранилище A, поэтому указатель фактически указывает на то, что существует.

0 голосов
/ 22 мая 2018

Учитывая:

double ****A;

my_function(A);

и предполагая, что эти строки появляются буквально в вашем коде без значения, присвоенного A, мы можем быть уверены, что вы передаете неинициализированное значение, указатель мусорадо my_function.Это само по себе имеет неопределенное поведение.Будет ли это причиной ошибки сегментации, будет зависеть от того, что my_function делает с этим значением.

Это:

double ***A;

my_function(&A);

передает допустимое значение типа double****.Это значение является адресом объявленного объекта.Сам по себе звонок совершенно действителен.(Это может привести к ошибке сегментации в зависимости от того, что my_function делает с ним, но вы не показали нам, что делает my_function, поэтому я не буду спекулировать дальше.)

РЕДАКТИРОВАТЬ: Я простозаметил фразу "похоже на следующее" в вашем вопросе.Не видя ваш точный код, мы не знаем, что вы пропустили, и ваш вопрос по сути не отвечает.(Я бы не опубликовал этот ответ, если бы заметил это изначально.)

...