【问题标题】:Why it gives me "segmentation fault" error when I change this code?为什么当我更改此代码时它会给我“分段错误”错误?
【发布时间】:2018-05-13 07:46:15
【问题描述】:

我可以毫无错误地编译这段代码:

#include <string.h>
#include <malloc.h>
#include <espeak/speak_lib.h>



espeak_POSITION_TYPE position_type;
espeak_AUDIO_OUTPUT output;
char *path=NULL;
int Buflength = 500, Options=0;
void* user_data;
t_espeak_callback *SynthCallback;
espeak_PARAMETER Parm;



char Voice[] = {"English"};


char text[30] = {"this is a english test"};
unsigned int Size,position=0, end_position=0, flags=espeakCHARS_AUTO, *unique_identifier;




int main(int argc, char* argv[] ) 
{
    output = AUDIO_OUTPUT_PLAYBACK;
    int I, Run = 1, L;    
    espeak_Initialize(output, Buflength, path, Options ); 
    espeak_SetVoiceByName(Voice);
    const char *langNativeString = "en"; //Default to US English
    espeak_VOICE voice;
    memset(&voice, 0, sizeof(espeak_VOICE)); // Zero out the voice first
    voice.languages = langNativeString;
    voice.name = "US";
    voice.variant = 2;
    voice.gender = 1;
//  espeak_SetVoiceByProperties(&voice);
    Size = strlen(text)+1;    

    espeak_Synth( text, Size, position, position_type, end_position, flags,
    unique_identifier, user_data );
    espeak_Synchronize( );

    return 0;
}

但我在尝试编译此代码时收到segmentation fault 错误(将所有代码放入man():

   #include <string.h>
    #include <malloc.h>
    #include <espeak/speak_lib.h>

    int main(){
    espeak_POSITION_TYPE position_type;
    espeak_AUDIO_OUTPUT output;
    char *path=NULL;
    int Buflength = 500, Options=0;
    void* user_data;
    t_espeak_callback *SynthCallback;
    espeak_PARAMETER Parm;
    char Voice[] = {"English"};
    unsigned int Size,position=0, end_position=0, flags=espeakCHARS_AUTO, *unique_identifier;

        output = AUDIO_OUTPUT_PLAYBACK;
        int I, Run = 1, L;    
        espeak_Initialize(output, Buflength, path, Options ); 
        espeak_SetVoiceByName(Voice);
        const char *langNativeString = "en"; //Default to US English
        espeak_VOICE voice;
            memset(&voice, 0, sizeof(espeak_VOICE)); // Zero out the voice first
            voice.languages = langNativeString;
            voice.name = "US";
            voice.variant = 2;
            voice.gender = 1;
            //espeak_SetVoiceByProperties(&voice);

        char tx[]="hi there, my name is Eliyaas, what's your name?";
        espeak_Synth( tx, strlen(tx)+1, position, position_type, end_position, flags,unique_identifier, user_data );
        espeak_Synchronize( );



    return 0;}

有什么区别,哪一行导致了这个错误? 是否可以将所有这些程序放在main() 函数中?怎么样?

(添加更多文本以传递添加发布错误所需的更多信息)(添加 传递更多文本添加发布错误所需的更多信息)(添加更多 要传递的文本添加发布错误所需的更多信息)(添加更多文本 通过添加发布错误所需的更多信息)

【问题讨论】:

  • 弄清楚如何在调试器下运行你的程序。它应该停在导致崩溃的行,并且您应该能够查看变量以查看程序的状态。
  • @FrançoisAndrieux:您好,如果您阅读了我的问题(putting all the code inside man() 的这一行,唯一的区别是将主代码之外的代码放入主代码中。就是这个。

标签: c++ error-handling segmentation-fault


【解决方案1】:

全局变量在 C++ 中初始化为零,局部变量不是,从它们中读取是未定义的行为。你的代码中有很多,例如:

espeak_POSITION_TYPE position_type;
espeak_AUDIO_OUTPUT output;

您需要编辑代码并确保所有变量都已正确初始化。例如 memset 如果它们是 POD,则与 voice 相同。

【讨论】:

  • 我可以像espeak_POSITION_TYPE position_type=0; 或espeak_AUDIO_OUTPUT output=0; 那样将它们全部初始化为零吗
  • 我不熟悉那个库,但看起来它们是结构而不是简单类型,如果是这种情况,那么没有。
  • @user145959 espeak_AUDIO_OUTPUT output = {0}; 会将整个结构设为 0。
  • @user145959 关于初始化变量的事情是,根据经验,您根本不需要这样做。问题是,如果你不这样做,你可能会想在它有价值之前使用它;这会导致未定义的行为。如果您想确保永远不会使用未初始化的变量(一个明智的计划),那么您应该初始化所有内容;类是一个例外;因为他们有一个构造函数,所以可以确保他们自己被正确初始化
  • @user145959 看起来这是一个 C 库,在他们的示例中,他们已经使用了 memset。可能以相同的方式初始化其余部分是最简单的。我已经在回答中提到了这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多