#include <stdlib.h>
#include <stdio.h>
main()
{
const char* str_int = "777";
const char* str_float = "333.3";
int i = atoi(str_int);
float f = atof(str_float);
printf("%s %s", i, f);
}
我已经尝试了几个我在网上找到的示例代码,所有这些代码都会导致总线错误。为什么会这样?
答案 0 :(得分:4)
您的printf
不正确。试试这个:
printf("%d %f", i, f);
问题是您的格式说明符是%s
,它们需要字符串。但是你给了它int
和float
。因此,结果是未定义的行为。
它崩溃的原因是因为printf
会尝试将参数读取为字符串(这是指针)并将它们作为指针推断它们,但它们是无效的指针。
以下是printf
及其格式说明符的参考:
答案 1 :(得分:3)
请养成询问编译器警告的习惯。使用gcc
它是-Wall
选项和(在Linux / Debian / Sid gcc 4.6上)我使用david.c
命令获取示例文件gcc -Wall -g -o david david.c
:
david.c:4:1: warning: return type defaults to 'int' [-Wreturn-type]
david.c: In function 'main':
david.c:11:5: warning: format '%s' expects argument of type 'char *', but argument 2 has type 'int' [-Wformat]
david.c:11:5: warning: format '%s' expects argument of type 'char *', but argument 3 has type 'double' [-Wformat]
david.c:12:1: warning: control reaches end of non-void function [-Wreturn-type]
新手应该更正他的代码,直到编译器不再发出警告。在非常罕见的情况下,可以接受警告(对于经验丰富的C程序员来说,每年应该少于一次)。
答案 2 :(得分:2)
不是,printf
是。您告诉printf
您传递了两个字符串("%s"
),而实际上您传递的是int
和{{1} }}。它应该是:
float
否则它会将堆栈上的两个参数视为字符串(即。printf("%d %f", i, f);
)。
由于两个char*
未按照承诺传递,当它尝试打印它认为是堆栈上的两个字符串的值时,它将导致未定义的行为并可能崩溃。这很可能是因为它试图取消引用的指针无效,实际上并不指向有效地址。
char*
无法判断您传递的参数是否正确,但编译器警告是否正确。 打开编译器警告。
请阅读此处了解有关gcc警告选项的更多信息(如果您正在使用的话):http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
请阅读此处了解有关格式说明符的更多信息(例如。printf
,%s
):http://www.cplusplus.com/reference/clibrary/cstdio/printf/
答案 3 :(得分:0)
Printf不正确。请将其更改为
printf("%d,%f",i,f);
请参阅此链接以清楚地了解printf语法:
http://www.codingunit.com/printf-format-specifiers-format-conversions-and-formatted-output