【问题标题】:Segmentation fault: concatenating string分段错误:连接字符串
【发布时间】:2012-03-10 20:13:33
【问题描述】:

我正在尝试连接两个字符并在返回上方的行上得到分段错误。 当我使用 char 而不是 char* 时,(onechar-a + 'A') 起作用了,尽管我没有尝试连接。如果我将其保留为 char 而不是 char* 我会收到有关强制转换的警告。

char *carat;
carat = test_carat(ttyinfo.c_cc[VINTR]);
carat = test_carat(ttyinfo.c_cc[VINTR]);

char * test_carat(char onechar)
{
    if (onechar >= 32 || onechar !=127)
    {
        if (iscntrl(onechar))
        {
            char * returnString =  strcat((char*)'^',  (char*)(onechar - 1 + 'A'));
            return returnString;
        }
    }
}

【问题讨论】:

  • strcat((char*)'^', 您不能将 int 文字转换为 char 指针(并附加到它...)if (onechar >= 32 || onechar !=127) { 看起来也很错误。
  • 也许(char*)'^' 不是一个好主意。 C 中的字符串非常非常复杂,在使用 C 字符串操作之前,您必须确保自己熟悉指针和内存分配。

标签: c


【解决方案1】:

那行不通:

   strcat((char*)'^',  (char*)(onechar - 1 + 'A') ) 

您不应该将字符转换为 char 指针。效果是字符值(值strcat用作字符指针的地址,这就是你的程序段错误的原因。

你可以这样做:

char * test_carat(char onechar)
{
    if (onechar >= 32 || onechar !=127)
    {
        if (iscntrl(onechar))
        {
            char * returnString = (char *)malloc(3);
            returnString[0] = '^';
            returnString[1] = (onechar - 1 + 'A');
            returnString[2] = '\0';
            return returnString;
        }
    }
    return NULL;
}

【讨论】:

  • 另外,'^' 是一个字符文字 - 它的内存是代码主体中的一个字节。因此,即使您尝试使用 & 获取其内存,您也会尝试将另一个字符连接到该内存位置的末尾 - 覆盖程序内存。您需要为 returnString 动态分配堆内存或至少将其声明为 3 char 数组 - 并将其作为 strcat 的第一个参数传递。
  • @pivotnig 我正在尝试进行连接,但现在我得到“传递 strcat 的 arg 2 使指针从整数没有强制转换 char * returnString = malloc(3); if (iscntrl(onechar) ) { char * newChar =(char*)(onechar - 1 + 'A'); strcat(returnString,'^'); strcat(returnString, newChar ) ; return returnString; }
  • 可以将字符常量转换为char*。但你不应该。
  • 只是想评论一下,如果使用这个例子,调用者必须记住在返回值上调用free()
猜你喜欢
  • 2012-07-21
  • 2012-11-14
  • 2011-08-17
  • 2013-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多