gpt4 book ai didi

C:位于 "printf"的神秘核心转储

转载 作者:行者123 更新时间:2023-11-30 19:57:28 27 4
gpt4 key购买 nike

我编写了一个简单的函数,用于创建一个“cd/dvd”,它接受 3 个参数:名称、评级和表示 cd/dvd 是否被翻录的“ bool 值”。

#include <stdio.h>

int makecd(char *Name, int Rating, int Ripped)
{
if((Rating > 5) || (Rating < 0))
{
printf("Rating is wrong!\n");
return 1;
}

if(Ripped = 0)
{
printf("Name: %s, Rating: %s/5, Ripped: false\n", Name, Rating);
return(0);
}
else if(Ripped = 1)
{
printf("Name: %s, Rating: %s/5, Ripped: true\n", Name, Rating);
return(0);
}
else
{
printf("Value of \"Ripped\" not set correctly!\n");
return(1);
}
}

int main(int argc, char *argv[], char *envp[])
{
makecd("Avatar", 4, 1);
/* std::cin.get(); */
char Ignore[65536] = {'\0'};
gets(Ignore);
return 0;
}

使用 dbx 进行一些调试后,我发现核心转储位于第 18 行(就在“if(Ripped = 1) { ... }”之后)。让我困惑的是,为什么我会得到核心转储。

dbx的输出如下:

signal SEGV (no mapping at the fault address) in strlen at 0xfee8645c
0xfee8645c: strlen+0x000c: movl (%eax),%edx
Current function is makecd
18 printf("Name: %s, Rating: %s/5, Ripped: false\n", Name, Rating);

最佳答案

您对 printf 使用了错误的格式说明符:

printf("Name: %s, Rating: %s/5, Ripped: false\n", Name, Rating);

%s 说明符需要包含以 null 结尾的字符串的字符数组的地址。第一个很好,但第二个是从参数列表中获取一个 int 。使用错误的格式说明符会调用 undefined behavior ,在本例中表现为崩溃。

如果要打印整数,请使用 %d 格式说明符:

printf("Name: %s, Rating: %d/5, Ripped: false\n", Name, Rating);

此外,这是不正确的:

if(Ripped = 0)

这不是通过赋值进行比较。要进行比较,请使用 == 运算符:

if(Ripped == 0)

关于C:位于 "printf"的神秘核心转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45378965/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com