繁体   English   中英

strcpy给出分段错误

[英]strcpy giving segmentation fault

考虑以下代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *cexpGen();
char *chartoStr(char c);

char c_exp[] = "1";
char expressions[2] = {'+', '-'};

int main()
{
    cexpGen();
    printf("%s", c_exp);
    return 0;
}

char *cexpGen()
{
    int now = 1;
    while ((c_exp[strlen(c_exp) - 1]) > 10)
    {
        if ((c_exp[strlen(c_exp) - 1]) == '+' || (c_exp[strlen(c_exp) - 1]) == '-')
        {
            strcpy(c_exp, chartoStr(((c_exp[strlen(c_exp) - 2]) + 1)));
            continue;
        }

        if (now = 1)
        {
            strcpy(c_exp, chartoStr(expressions[0]));
            now++;
            cexpGen();
        }

        if (now = 2)
        {
            strcpy(c_exp, chartoStr(expressions[1]));
            now++;
            cexpGen();
        }

        if (now = 3)
        {
            strcpy(c_exp, chartoStr(((c_exp[strlen(c_exp) - 1]) + 1)));
        }
    }
}

char *chartoStr(char c)
{
    char s[2] = {c, '\0'};
    return s;
}

我想连接一个cahracter和一个字符串,但是我们没有执行此操作的函数,所以我定义了一个chartoStr函数。 同样,c_exp和表达式变量也不处于只读模式,但是strcpy()给了我分段错误。 我也以任何方式尝试了其他功能,例如strcat,但没有帮助。

如果有帮助,我可以在VS Code中对其进行调试。 它打开strcpy-sse2-unaligned.S并在其中一行显示分段错误。

是否需要launch.json或task.json文件? 我认为它们可能无济于事,所以我没有用代码来补充问题,但请告诉我是否需要它们。

chartoStr()返回一个在函数末尾不再可用的本地,并由@kiran Biradar回答

char s[2] = {c, '\0'};
return s;  // bad, UB

调用chartoStr()一种替代方法,以使用复合文字 (在C99起)在调用代码中创建字符串

// strcpy(c_exp, chartoStr(expressions[0]));
//            v-----------------------------v---- compound literal         
strcpy(c_exp, (char []){expressions[0], '\0'});

一个不错的属性是,没有昂贵的分配,也没有免费的指针。 复合文字在块的末尾之前一直有效。


请注意,代码可以通过在cexpGen() size_t len = strlen(c_exp)一次size_t len = strlen(c_exp)的长度并使用它来追加来进行其他改进。

// strcpy(c_exp, chartoStr(expressions[0]));
c_exp[len++] = expressions[0];
c_exp[len] = '\0';

其他问题

注意@alk关于char c_exp[] = "1";

while (c_exp[strlen(c_exp) - 1]) > 10未定义的行为strlen(c_exp)应该返回0。也许while ((len = strlen(c_exp)) > 0 && c_exp[len - 1]) > 10吗?

if (now = 1)始终为true。 @ user3386109

因为您正在返回局部变量的地址,所以您遇到段错误。

char s[2] = {c, '\0'};
    return s;

一旦控件退出chartoStr函数, s将被销毁。

编译器也警告同样

警告:函数返回本地变量[-Wreturn-local-addr]的地址

  return s; ^ 

您不需要strcpy复制可以直接分配的单个字符。

要解决您的问题,您可以尝试以下操作。

char *chartoStr(char c)
{
    char *s = malloc(2);
     s[0] = c;
     s[1] =  '\0';
    return s;
}

不要忘记释放s工作完成之后。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM