为什么atoi()会导致总线错误?

时间:2011-11-09 05:44:35

标签: c atoi

#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 个答案:

答案 0 :(得分:4)

您的printf不正确。试试这个:

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

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

它崩溃的原因是因为printf会尝试将参数读取为字符串(这是指针)并将它们作为指针推断它们,但它们是无效的指针。

以下是printf及其格式说明符的参考:

http://www.cplusplus.com/reference/clibrary/cstdio/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

相关问题