为什么我会收到“分段错误”?

时间:2017-09-18 07:06:54

标签: c

我已经搜索并尝试了许多其他问题的答案,比如我的问题,但我仍然没有得到它,我不知道我在这里缺少什么。这个程序应该模拟拍卖,这是一个较小的“出价”获胜的游戏。我已经提出了这个代码,但是当我使用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);
}

3 个答案:

答案 0 :(得分:3)

您已将字符串文字"nome"传递给func02(),而您正在编写它。

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

答案 1 :(得分:1)

您无法使用strcpy函数将字符串复制到字符串文字中。

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

答案 2 :(得分:1)

好的,首先,当您发布这样的问题时,最好显示代码崩溃的行,最好是回溯。话虽如此,这是正在发生的事情:

lanc = func02(0, 36, 15, 0, 0, "nome");

这里您将常量字符串“nome”发送到func02

strcpy(nome, "ceadf");

在这里,您尝试将“ceadf”复制到nome,但由于两个原因而失败:

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

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