Код на C передает структуру в функцию переполнения стека - PullRequest
0 голосов
/ 06 марта 2012

Хорошо, у меня возникла проблема с текущим назначением (поверьте мне, это крошечная часть этого), поскольку мы обязаны писать в коде C, а не C ++, и нам не разрешено изменять определенные части кода,Итак, у меня есть определенная структура:

    typedef struct someStruct {
    int what;
    int something[MAX];
    int another[MAX];
} someType;

в main () Я инициализирую все значения в определенной структуре:

someType whatever, *whatptr;

EDIT: конечно, установите указатель на структуру,пытаюсь упростить код для примера. Он уже присутствует в моем коде

whatptr = &whatever;
whatever.what = 0;
// initialize both arrays to hold 0 at all indexes
// Then I must call a function progRun()
progRun();  //I need to pass struct 'whatever' in some way

Теперь progRun () выглядит так:

void progRun(){
printWhat(&whatever);

    if (whatever.what == 0) {
    //do stuff 
    }
}

Я не могу ничего изменить в этом кодекроме того, что параметры для передачи внутри функции progRun (), и я могу добавить вещи перед printWhat ().Я попытался изменить progRun на

void progRun(someType *stptr)

, затем вызвать его в main как

progRun(whatptr);

, но по какой-то причине это вызывает проблему переполнения стека, я попытался пройти черезотладчик, и это происходит только при вызове функции.Есть ли лучший способ передать структуру «what» в функцию, чтобы она могла быть передана в progRun () и printWhat () и получить доступ к «what.what»?

Любая помощь будет принята с благодарностью!тем временем я попытаюсь понять это сам, если смогу.

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

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

Ответы [ 2 ]

1 голос
/ 06 марта 2012
void progRun(someStruct *ptr) {
    someStruct whatever2 = *ptr;
    printWhat(whatever2);
    if (whatever2.what == 0) { ...
}

whatptr = &whatever;
progRun(whatptr);

Ваша проблема заключалась в том, что:

  • вам нужно передать указатель на whatever, но вы передавали переменную (whatptr), которая не имела абсолютно никакого отношения кделать с whatever.

    Сначала необходимо присвоить указатель чему-либо в вашей переменной указателя.

  • Вы не разыменовываете указатель в функции

Альтернативно, избавьтесь от переменных указателя:

void progRun(someType *stptr) {
    printWhat(*stptr);
    if (stptr->what == 0) { ...
}

progRun(&whatever);
0 голосов
/ 06 марта 2012

Инструкция

someType whatever, *whatptr;

- это проблема:

*whatptr не будет указывать на struct whatever, если вы не выполните назначение следующим образом:

whatptr = &whatever;

В качестве альтернативы вы можете динамически распределять память в куче для указателя на struct whatever, используя функцию malloc(), и передавать указатель, возвращаемый malloc, в функцию progrun:

whatptr = (someType*) malloc ( sizeof(someType) );
if (whatptr == NULL) exit (1);

//whatever you need to do with your code

progrun(whatptr); // call function like this

В этом случае вам, конечно, потребуется разыменовать указатель, чтобы получить доступ к элементам struct с помощью оператора стрелки ->:

whatpr->what = 0; // for example

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


Если вы можете 't измените операторы print и if, тогда вы должны передать своей функции копию вашего struct:

void progRun( someType whatever ){ // <---Passing by copy
printWhat(&whatever);

    if (whatever.what == 0) {
    //do stuff 
    }
}

, а в вашем main() вы должны просто вызвать функцию следующим образом:

someType whatever;
//assign values to members of the struct
progRun(whatever);

и не нужно вообще определять и назначать указатель на struct.

Хотя и проходитПеременные к функциям при копировании (особенно, когда они являются объектами, составленными из многих переменных, таких как struct is), это нехорошее поведение:

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