【问题标题】:Why does program's calling strncat() generate segmentation fault?为什么程序调用 strncat() 会产生分段错误?
【发布时间】:2012-06-08 23:10:13
【问题描述】:

我无法弄清楚为什么我的 g++ 编译程序在 strncat() 调用时会出现段错误。

我一直在浏览这个网站和一般的谷歌搜索,发现了许多类似的问题,但没有找到任何适合我的解决方案。这是一个更大的代码的一部分,我只能做很多事情来重新定义变量,因为代码不是我的。

这部分代码的目的是读取文件的最后一行,删除相关数据并连接到一个 char*

当我运行它时,我在strncat(RAM,nextchar,1) 的行出现分段错误

char line[256]={"0"};
char nextchar[10]={"0"};
int length=0;
double rac;
double decc;
bool SPACE=false;
char * RAM="RA: ";
char * DECM="DEC: ";
if(AutoColData.good()){
    while(!AutoColData.eof()) AutoColData.getline(line,256);
    for(int i=0;i<strlen(line);i++){
        nextchar[0]=line[i];
        cout<<line[i];
        if(isspace(nextchar[0])&& !SPACE)   SPACE=!SPACE;
        else if(SPACE && !isspace(nextchar[0])){
            SPACE=!SPACE;
            length++;
        }
        if(length==6) {
          cout<<"\n"<<RAM<<nextchar<<"\n";
          strncat(RAM,nextchar,1);
        }
        else if(length==7) strcat(DECM,nextchar);
    }
}

这里有一些草率的选择,我知道(整个“SPACE”的东西很混乱)。但我认为 Seg Fault 没有任何理由。它运行良好,直到使用 strncat() 的行。 cout 工作正常,两个字符串都打印并在其中包含正确的数据,但是 strncat 失败。我尝试过使用 malloc()、字符串,但似乎没有任何效果。如果有人能指出我在做什么愚蠢的事情,那将非常有帮助。谢谢。

【问题讨论】:

  • 嗯,第一件事是您尝试修改字符串文字,即使没有为您添加的额外字符保留空间。任何指向文字的字符指针都应该是const char *。也许你收到了这个警告,或者你的警告级别太低了,但是 GCC 吐出了warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
  • 当您解决第一个问题时,while(!AutoColData.eof()) 循环也会遇到另一个问题:stackoverflow.com/questions/5605125/…
  • 如果这是真正的 C++,那么使用 std::string 将更容易正确处理。否则,请先将 "RA: " 复制到足够大的缓冲区中,然后再尝试将某些内容粘贴到末尾。
  • 所以我在声明的时候需要给字符串更多的内存?类似于: char* RAC[32];然后添加数据 RAC="RA:";?
  • 请去掉c++标签,叫它c

标签: c++ segmentation-fault


【解决方案1】:

RAM 被错误地声明为char *,而实际上它应该是const char *:字符串文字是只读,您不能写入它们。您的 strncat 调用只是未定义的行为。

如果你想要一个可写的字符串,你可以创建一个足够大的 char 数组:char RAM[100] = "RA: ";(这将在后面补零),或者更好的是,只需使用std::string

std::string RAM = "RA: ";
RAM += nextchar;

【讨论】:

    猜你喜欢
    • 2011-01-27
    • 2015-07-23
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多