c - 为什么使用 scanf 输入整数时会出现段错误?

标签 c

我正在尝试计算使用 scanf 输入的 3 个变量相乘的结果,但是在输入 Duration 变量时,它给了我一个段错误。

#include <stdio.h>
int main(){
       float rate;
       rate = 0.06;
       int duration;
       float principal_amount;
       float total_interest;
   printf("Enter duration in years:");
   scanf("%d", duration);
   printf("Enter principal amount of loan:");
   scanf("%f", principal_amount);
   total_interest = principal_amount * duration * rate;
   printf("Output: %f", total_interest)
   return 0;
}

最佳答案

duration 的类型为 int,但您想要一个整数指针作为 scanf 的参数,

scanf("%d", &duration);

scanf 的工作原理是将适当的字节放入内存中的某个位置,以便在 scanf 完成后产生副作用,提供内存中指针地址处的值将是从输入读取的值。由于您希望 duration 本身包含该值,因此意味着您希望将其读入 duration 的内存位置,其语法表示为 &duration (“持续时间的地址”)。

段错误的原因是整数duration未初始化,因此在程序启动时可能包含一些(未定义的)值。就尝试通过整数到达内存地址而言,任何整数都与其他整数一样好,因此 C 运行时很乐意尝试将 duration 内的任何值视为一个内存地址,但您的程序无权更改它的内存地址。 (很多情况下它实际上是0,这相当于尝试将一些数据写入NULL,但这并不能严格保证,甚至是理论上来说,duration 可以用一个指向有效内存位置的整数随机初始化……这可能会导致更严重的错误,因为将 scanf 的结果写入该位置不会产生任何可见的错误或段错误)。

关于c - 为什么使用 scanf 输入整数时会出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48931529/

相关文章:

通过++i 在 for 循环中检查条件

c - 声明结构指针时出错

c++ - 如何将 unsigned char 数组转换为 unsigned long long?

c - 使用数组和随机数循环打印一个简单的 5 x 5 板

c - Lua:查询用户数据对象的元表名称

c - 如何在数组中存储00?

java - 确定变量中保存的值是否唯一

c++ - GNU Make 因 If 语句中的语法错误而退出

c - gcc makefile 无法编译

c++ - 从 Linux 中的 C/C++ 程序发送电子邮件