2015-11-26 2 views
0

Я работаю с VS2012, в проекте, который сочетает код C и C++. Эта проблема не возникает при запуске кода в GCC.C Странный переполнение стека при вызове другой функции

(Смотрите скриншот внизу)

В приведенной ниже C функция не будет работать на переполнение стека, немедленно, когда функция вызывается FeedForwardNetwork_new_from_string(). Отладчик прерывается после вызова этой функции, но до того, как выполняется какой-либо код этой функции.

FeedForwardNetwork *FeedForwardNetwork_new_from_file(const char *filePath) { 
    char *file_contents; 
    long input_file_size; 
    FILE *input_file = fopen(filePath, "rb"); 
    FeedForwardNetwork *ffn; 

    if (input_file == NULL) { 
     return NULL; 
    } 
    fseek(input_file, 0, SEEK_END); 
    input_file_size = ftell(input_file); 
    rewind(input_file); 
    file_contents = (char*)malloc((input_file_size + 1) * (sizeof(char))); 
    fread(file_contents, sizeof(char), input_file_size, input_file); 
    file_contents[input_file_size] = '\0'; 
    fclose(input_file); 

    ffn = FeedForwardNetwork_new_from_string(file_contents); 

    free(file_contents); 

    return ffn; 
} 

Это поток к функции, начиная с main():

int main(int argc, char **argv) { 
    VideoAnalyzerUtils::getNeuralNetwork(); 

    return 0;   
} 

Функция getNeuralNetwork(), которая вызывает проблематичный функцию:

FeedForwardNetwork *VideoAnalyzerUtils::getNeuralNetwork() { 
    if (VideoAnalyzerUtils::network_ == NULL) { 
     VideoAnalyzerUtils::network_ = FeedForwardNetwork_new_from_file("net.txt"); 
    } 
    return VideoAnalyzerUtils::network_; 

}

Осуществление от FeedForwardNetworkSettings_new_from_string():

FeedForwardNetworkSettings *FeedForwardNetworkSettings_new_from_string(const char *settingsStr) { 
    char buffer[NEURON_STR_READ_BUFFER_SIZE]; 
    int withBias; 
    double trainingRate ; 
    double outputLayerTrainingRate; 
    int hiddenLayerType; 
    int outputLayerType; 
    FeedForwardNetworkSettings *settings; 

    _Neuron_getValueFromString(settingsStr, "withBias=", buffer); 
    if (strcmp(buffer, "") == 0) { 
     return NULL; 
    } 
    withBias = atoi(buffer); 
    _Neuron_getValueFromString(settingsStr, "trainingRate=", buffer); 
    if (strcmp(buffer, "") == 0) { 
     return NULL; 
    } 
    trainingRate = atof(buffer); 
    _Neuron_getValueFromString(settingsStr, "outputLayerTrainingRate=", buffer); 
    if (strcmp(buffer, "") == 0) { 
     return NULL; 
    } 
    outputLayerTrainingRate = atof(buffer); 
    _Neuron_getValueFromString(settingsStr, "hiddenLayerType=", buffer); 
    if (strcmp(buffer, "") == 0) { 
     return NULL; 
    } 
    hiddenLayerType = atoi(buffer); 
    _Neuron_getValueFromString(settingsStr, "outputLayerType=", buffer); 
    if (strcmp(buffer, "") == 0) { 
     return NULL; 
    } 
    outputLayerType = atoi(buffer); 


    settings = (FeedForwardNetworkSettings*)malloc(sizeof(FeedForwardNetworkSettings)); 
    settings->withBias_ = withBias; 
    settings->trainingRate_ = trainingRate; 
    settings->outputLayerTrainingRate_ = outputLayerTrainingRate; 
    settings->hiddenLayerType_ = (NeuronActivationFunction)hiddenLayerType; 
    settings->outputLayerType_ = (NeuronActivationFunction)outputLayerType; 

    return settings; 
} 

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

Скриншот ошибки (пожалуйста, используйте зум-в браузере, чтобы увидеть его лучше):

Screenshot http://s23.postimg.org/fvtetkjgq/c_error.jpg

+1

Вы, наверное, дует свой стек - единственный способ угадать бы увидеть код вызываемой функции, а не вызывающий. – Mat

+0

Не размещайте изображения. Сообщение! – Olaf

+1

У вас есть большой локальный массив где-то еще? Возможно ли создать [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) и показать нам? –

ответ

1

Вы попали размер стека 1 Мб по умолчанию в Visual Studio компилятор. gcc имеет 8-мегабайтный стек по умолчанию, поэтому он работает с gcc.

Вы можете динамически распределять буфер, используя malloc или calloc, или увеличить размер стека.

Visual Studio поддерживает следующие флаги, чтобы установить размер стека:

/STACK:reserve[,commit]

или

/F stack-size-in-bytes

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