gpt4 book ai didi

C 调用另一个函数时出现奇怪的堆栈溢出

转载 作者:行者123 更新时间:2023-11-30 15:14:44 24 4
gpt4 key购买 nike

我使用 VS2012 开发一个结合了 C 和 C++ 代码的项目。在GCC中运行代码时不会出现此问题。

(见底部截图)

当函数 FeedForwardNetwork_new_from_string() 时,下面的 C 函数会在堆栈溢出时立即失败。叫做。调试器在调用该函数之后、执行该函数的任何代码之前中断。

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

最佳答案

您达到了 Visual Studio 编译器的 1 Mb 默认堆栈大小。 gcc 有 8 Mb 默认堆栈,这就是它与 gcc 一起使用的原因。

您可以使用malloccalloc动态分配缓冲区,或者增加堆栈大小。

Visual Studio 接受以下标志来设置堆栈大小:

/STACK:保留[,提交]

/F 堆栈大小(以字节为单位)

关于C 调用另一个函数时出现奇怪的堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33933613/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com