在firstapp1.exe中的0x6D4DE559(ucrtbased.dll)处引发异常:0xC0000005:访问冲突写入位置0x00000000

时间:2019-01-13 03:58:53

标签: c memory

我在网上查找了该信息,而我在使用C时只能找到C ++的线程,所以我来问一下,对不起,是否重复。

我仍在学习,并且试图了解

我刚刚了解了strcpy和strcmp,但是我的大脑无法处理以下代码为何无效的原因;

void ifelse();
char nametype[100]; 
char typeofname[100];
char truth[100];

int main() {

    char name[100];
    int age;


    printf("\n Print \n");
    ifelse();
    printf("Enter your name: ");
    fgets(name, 100, stdin);
    printf("Enter your age: ");
    scanf("%d", &age);
    if (age > 50) {
        strcpy(truth[100], "and you are an old person.");
    }
    if (age < 50) {
        strcpy(truth[100], "and you are relatively young.");
    }
    else {
        strcpy(truth[100], "and you're a middle age person with issues...");
    } 

    printf("Hello, your %s is %s, %s", nametype, name, truth);

    return 0;
}

void ifelse() {

    printf("Enter your name type (firstname/lastname): ");
    fgets(typeofname, 100, stdin);
    if (strcmp(typeofname, "firstname") == 0) {
        strcpy(nametype[100], "first name");
    }
    if (strcmp(typeofname, "lastname") == 0) {
        strcpy(nametype[100], "last name");
    }
}

在if和else语句中,当我尝试复制名为“ truth”的字符串时遇到错误,我还尝试键入strncpy以防万一,但是没有。

它应该继续执行底部的打印功能,但要么不打印变量,要么输出分配错误

1 个答案:

答案 0 :(得分:0)

strcpy接受两个指向缓冲区的指针,即数组。 truth[100]不是指向缓冲区的指针,它是数组之后的元素。因此正确的呼叫应如下所示:

strcpy(truth, "and you are an old person.");
strcpy(nametype, "first name");

更正代码中的所有类似调用。