2015-02-28 2 views
0

Это мой первый пост здесь. Я попытался найти аналогичный вопрос, но не смог найти его, и поэтому я отправляю этот вопрос.C: Копирование данных указателя с использованием = (равно)

Я пытаюсь скопировать данные в указатель структуры на другой указатель структуры в C, как показано ниже. Похоже, что с помощью просто '=' сделал трюк. Может ли кто-нибудь объяснить, как данные в указателе srcStruct были скопированы в другое место памяти (указатель destStruct) без использования memcpy()?

Это свойство указателя? или есть ли риск в этом?

struct myTestStruct 
{ 
    short variable1; 
    short variable2; 
}; 
struct myTestStruct *destStruct = (struct myTestStruct *)malloc(sizeof(struct myTestStruct)); 
struct myTestStruct *srcStruct = (struct myTestStruct *)malloc(sizeof(struct myTestStruct)); 
srcStruct->variable1 = 11; 
srcStruct->variable2 = 12; 
*destStruct = *srcStruct; 

Заранее спасибо.

С уважением, AJK

ответ

1

С помощью функции разыменования оператора *, вы в основном обработки данных, указатели указывать как обычные переменные. Структуры копируются по значению, а не по ссылке, если вы не копируете указатель, поэтому он просто копирует int в другой int. Вы, по сути, выполнив следующие действия с помощью оператора разыменования *:

struct myTestStruct destStruct, srcStruct; 
srcStruct.variable1 = 11; 
destStruct = srcStruct;   //this gets copied by value 
0

Что вы здесь делаете на самом деле не связаны с указателями на всех; это свойство структур вообще в C, что они могут быть назначены как единое целое с одной операцией =. Когда вы разыскиваете указатель, вы используете указательное значение непосредственно в выражении, то то, что вы действительно получили там, с разыменованием с обеих сторон, представляет собой назначение из структуры значений в другую структуру значений. Указатели оба были «расширены», оставив значения самих структур.

Как скопировано значение до компилятора. Это, скорее всего, испустит пользовательские инструкции, чтобы сделать это наиболее эффективным способом, но он также может использовать memcpy, если захочет. Для этого нет никакого риска - структурируемые объекты являются основным элементом языка C и не уходят! Это совершенно идиоматично и, как правило, лучший способ делать то, что вы делаете, которому нужны данные, скопированные из одной структуры в другую. Конечно, лучше, чем ссылаться на memcpy без необходимости.

Смежные вопросы