2015-06-06 2 views
-1

скажу я получил-структуру, как это:указателя в функции от Struct не работает

typedef struct myInfo { 
    WORD myCount; 
    WORD data[0]; 
} myInfo; 

Ну, я хотел бы использовать эту структуру (что объявить EXTERN, кстати), в другом .c исходный файл, где у меня есть функция, как это:

void dynamic_init(struct myInfo dummy){ 

    macroPut(5, dummy.myCount, &dummy.mydata); <- doesn't work 
     macroPut(5, dummy.myCount, &externalInitialized.mydata); <- works 
} 

Таким образом, я бы динамически использовать этот dynamic_init без worring об имени STRUCT ... Но, как у мог легко увидеть в моем фрагменте кода выше, это работает только с инициализированной структурой ... но если я вызываю функцию таким образом:

dynamic_init(externalInitialized); 

Это не сработает.

Другими словами, я должен сделать что-то вроде этого:

dynamic_init(externalInitialized.myCount, externalInitialized.mydata); 

И у меня есть результат ожидается.

Главное mistery - это «mydata» WORD, которое все испортило. "myCount" работает, как ожидалось, если я это сделать так:

dynamic_init(externalInitialized, externalInitialized.mydata); 

, а затем:

недействительным dynamic_init (структура externalInitialized манекена, WORD * dynData) {

macroPut(5, dummy.myCount, &dynData); <- works 

}

Я знаю, что это глупо, но это просто показать точную неправильную часть.

Спасибо!

+1

Показать полный код – Amit

+0

Что такое "another_function"? –

+1

Это определение _type_, как следует из слова 'typedef', оно не является выражением _declaration_, и вы не создаете _define_ a struct. Пожалуйста, опубликуйте [MCVE] (http://stackoverflow.com/help/mcve) и определите, что вы пробовали, хотите достичь и что вы на самом деле получаете. – Olaf

ответ

1

Когда вы передаете структуру функции, компилятор генерирует код для копирования содержимого структуры, поэтому функция получает свою собственную копию параметров, которую она может свободно изменять без ущерба для оригинала. Копирование выполняется для sizeof struct байт.

Ваша основная проблема здесь в том, что ваша структура имеет flexible array member, поэтому ее sizeof имеют очень мало общего с реальным размером, который она займет.

E.g. Структура в вопросе sizeof - 4 (последнее поле - это массив из 0 элементов, поэтому он не увеличивает размер), но при распределении памяти для структуры вы фактически выделяете гораздо больше - и сохраняете «реальный» размер в поле структуры. Таким образом, доступ к массиву data будет фактически получать элементы вне самой структуры (помещается прямо рядом с ним); однако компилятор этого не знает (и не может знать, так как размер отличается от одного экземпляра структуры другим). По той же причине вы не можете напрямую разместить эту структуру в стеке и безопасно заполнять данные - потому что это коснется байтов, которые не принадлежат ему, и повредит другие вещи (технически это можно поместить в стек, но вы должны вручную выровнять его внутри на стеке достаточного размера).

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

Таким образом, короткий ответ: «Не пропускайте гибкие структуры по значению».Или даже подумайте дважды, прежде чем передать структуру по стоимости вообще - копирование не является бесплатным, в конце концов.

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