C 为什么我会得到;分段错误;?

C 为什么我会得到;分段错误;?,c,C,我已经搜索并尝试了许多其他问题的答案,比如我的,但我仍然不明白,我不知道我在这里遗漏了什么。这个程序应该模拟一个拍卖,这是一个较小的“出价”获胜的游戏。我已经想出了这段代码,但是当我使用strcpy和char变量类型时,出现了这个分段错误 #include <stdio.h> #include <stdlib.h> #include <string.h> int func02(int venc, int nj, int max, int mod, float

我已经搜索并尝试了许多其他问题的答案,比如我的,但我仍然不明白,我不知道我在这里遗漏了什么。这个程序应该模拟一个拍卖,这是一个较小的“出价”获胜的游戏。我已经想出了这段代码,但是当我使用strcpy和char变量类型时,出现了这个分段错误

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

int func02(int venc, int nj, int max, int mod, float med, char *nome);
int lanc;

int main (void)
{

    lanc = func02(0, 36, 15, 0, 0, "nome");
    printf("%d", lanc);
    return EXIT_SUCCESS;
}

int func02(int venc, int nj, int max, int mod, float med, char *nome)
{

    int lance;

    if (venc == 0) {
        strcpy(nome, "ceadf");
        lance = 4;
    }
    else {
        if ((med <= mod) && (venc >= mod)) {
            lance = mod++;
        }
        else {
            lance = venc++;
        }
    }
    return(lance);
}
#包括
#包括
#包括
int func02(int venc、int nj、int max、int mod、float med、char*nome);
int lanc;
内部主(空)
{
lanc=func02(0,36,15,0,0,“nome”);
printf(“%d”,lanc);
返回退出成功;
}
int func02(int venc、int nj、int max、int mod、float med、char*nome)
{
内喷管;
如果(venc==0){
strcpy(nome,“ceadf”);
兰斯=4;
}
否则{
如果((med=mod)){
lance=mod++;
}
否则{
lance=venc++;
}
}
回程(喷管);
}

您已经将字符串literal
的“nome”
传递给了
func02()
,您正在编写它


字符串文本是只读的,写入它们将导致未定义的行为,如分段失败

您不能使用strcpy函数将字符串复制到字符串文本中


而是动态分配字符串,然后调用strcpy()。

好的,首先,当你发布这样的问题时,最好显示代码在哪一行崩溃,最好是回溯。话虽如此,情况如下:

lanc = func02(0, 36, 15, 0, 0, "nome");
这里您将常量字符串“nome”发送到
func02

strcpy(nome, "ceadf");
您正在尝试将“ceadf”复制到
nome
,但由于两个原因失败:

  • nome
    是一个常量字符串。你不能修改它

  • 即使您可以修改它,它也只有五个字符长(每个字母的“nome”加上空字节),您试图将六个字节复制到其中(“ceadf”的每个字母加上一个空字节)。即使您使用的是可写字符串,这也是内存问题。一般来说,我会避免使用strcpy,因为它很容易犯这样的错误


  • lanc=func02(0,36,15,0,0,“nome”)然后
    strcpy(nome,“ceadf”)您不能使用所有警告和调试信息进行编译(
    gcc-Wall-Wextra-g
    with…)。使用调试器
    gdb
    @RohanKumar请不要编辑帖子的样式(比如在自己的行中移动大括号),这没有用。@FedericoklezCulloca:啊,对不起。我会从下次开始记住这一点;)@正如你提到的,我已经编译了BasileStarynkevitch。我没有调试器,因为我正在使用Putty连接到运行Debian的服务器,用于教育目的。我在哪里粘贴来自GCC的警告?