2
#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); 
}

我尝试了一些我在网上找到的示例代码,所有这些都会导致总线错误。为什么会这样?

4

4 回答 4

5

printf的不正确。试试这个:

printf("%d %f", i, f); 

问题是您的格式说明符是%s,它需要字符串。但是你给了它一个int和一个float。因此结果是未定义的行为。

它崩溃的原因是因为printf会尝试将参数读取为字符串(它们是指针)并照此处理它们,但它们是无效的指针。

这是关于printf及其格式说明符的参考:

http://www.cplusplus.com/reference/clibrary/cstdio/printf/

于 2011-11-09T05:46:24.347 回答
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 程序员来说,这种情况每年应该少于一次)。

于 2011-11-09T05:55:32.847 回答
2

不是,printf是。你说printf你正在传递两个字符串( "%s"),而实际上你传递的是 anint和 a float。它应该是:

printf("%d %f", i, f); 

否则,它会将堆栈上的两个参数视为字符串(即。char*)。

由于两个char*s 没有按承诺传递,当它试图打印堆栈上它认为是两个字符串的值时,它会导致未定义的行为并可能崩溃。这很可能是因为它试图取消引用的指针是无效的,实际上并不指向有效地址。

printf无法判断您传递的参数是否正确,但是您的编译器警告会。打开你的编译器警告。

在此处阅读有关 gcc 警告选项的更多信息(如果您正在使用): http: //gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

在此处阅读有关格式说明符(即%s, %d)的更多信息:http ://www.cplusplus.com/reference/clibrary/cstdio/printf/

于 2011-11-09T05:47:39.417 回答
0

Printf 不正确。将其更改为

 printf("%d,%f",i,f);

请参阅此链接以清楚地了解 printf 语法:

http://www.codingunit.com/printf-format-specifiers-format-conversions-and-formatted-output

于 2011-11-09T05:50:24.277 回答