2016-09-01 2 views
0

Так меня попросили эти 2 вопроса в моем interview-Копирование строки из одного указателя на другой в одном процессе, а также между 2 процессами

1-что, если у меня есть фрагмент кода, как это в C, что будет выходной

char *ptr1=malloc(10); 
ptr1="abc"; 
char *ptr2 = malloc(20); 
ptr2="defghi"; 
strcpy(ptr1,ptr2); 
printf("%s",ptr1); 

Я попробовал этот на моем терминале после возвращения домой, и он дает эту ошибку

[1] 7673 bus error ./b.out 

Я хотел бы знать, как скопировать строку в таком случае от одного указателя на Аноф э.

2- Мы имеем 2 процесса А и В

Это код в способе А

char *ptr1=malloc(10); 
ptr1="abc"; 
char *ptr2 = malloc(20); 
ptr2="defghi"; 
strcpy(ptr1,ptr2); 

теперь адрес ptr1 передается процессу Б с использованием межпроцессного взаимодействия и код в процессе B (ptr1 является адресом из процесса A)

char *ptr3=malloc(10); 
ptr3=ptr1 
printf("%s",ptr3); 

Каким будет результат этого? Если ans - значение мусора или ошибка, то каким образом мы можем сделать ptr3, указывая на строку, указанную ptr1.

+1

Этот код не имеет смысла. Вы выделяете память на ptr1, а затем назначаете ptr1 постоянному строковому значению. Это фиксируется где-то в памяти. Вы не можете просто скопировать «defghi» в ptr1. – OldProgrammer

+0

Они тестируют, если вы знаете, что делает код C. Просто вы не дали интервью. В случае 1 вы не только перезаписываете указатели 'malloc' указателями строковых литералов и пытаетесь скопировать один строковый литерал в другой, но тот, который вы копируете (даже если он является законным), меньше. –

+0

@OldProgrammer Я не понял, почему этот код не имеет смысла. По мне сначала мы выделили некоторое пространство для ptr1, затем мы заполнили «abc» в этом пространстве, мы сделали то же самое для ptr2, а затем попытались заполнить ptr1 кусок с тем, что присутствует в ptr2, а затем распечатать результат. Пожалуйста, скажите мне, где я ошибаюсь. –

ответ

3

Я хотел бы знать, как скопировать строку в таком случае из одного указателя в другой.

Вы не можете. Указатели не содержат строк или их символов. Они могут, однако, указать на массивы символов с нулевым символом, то есть строки.

Имея это в виду, важно понять, что здесь:

char *ptr1=malloc(10); 
ptr1="abc"; 

вы выделить блок памяти (или попытаться сделать), присвоить его адрес переменной ptr1, а затем сразу же перезаписать, что значение указателя с указателем на аранжировщик, представленный строковым литералом "abc". Исходное значение указателя теряется - вы просачиваете эту память. В частности, присваивание абсолютно не копирует символы литерала в выделенное пространство.

Теперь имейте в виду, что попытка изменить любую часть строкового литерала вызывает неопределенное поведение, является ли изменение прямым или косвенным. Это:

strcpy(ptr1,ptr2); 

представляет собой попытку изменить строковый литерал "abc" косвенно через указатель ptr1. Если вопрос был «что такое результат», тогда это был трюк. Программа имеет неопределенное поведение - ее вывод не может быть предсказан, по крайней мере, не только из кода C.


Дело IPC - это другой вопрос. Значения указателя имеют смысл только в контексте процесса, в котором был получен указатель. Если вы передадите этот указатель на другой процесс через некоторую форму IPC, нет никаких оснований полагать, что он действителен в процессе приема. Даже если это действительно так, нет никакого указания на то, на что он указывает.Если вы хотите отправить строку в другой процесс, вы должны отправить символы, а не указатель.

+0

Спасибо за ответ, я получил вашу мысль. –

+0

@ KaviKavi, я уже сделал. –