Почему atoi () вызывает ошибку шины? - PullRequest
1 голос
/ 09 ноября 2011
#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 голосов
/ 09 ноября 2011

Ваш printf неверен.Попробуйте вместо этого:

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

Проблема в том, что ваши спецификаторы формата %s, которые ожидают строки.Но вы дали ему int и float.Следовательно, результатом является неопределенное поведение.

Причина его сбоя заключается в том, что printf будет пытаться считывать параметры как строки (которые являются указателями) и обрабатывать их как таковые, но они являются недействительными указателями.

Вот ссылка на printf и его спецификаторы формата:

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

3 голосов
/ 09 ноября 2011

Пожалуйста, примите привычку запрашивать предупреждения у вашего компилятора . С 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]

Новичок должен исправлять свой код, пока компилятор не выдаст больше предупреждений . В очень редких случаях допустимо оставлять предупреждение (это должно случаться не чаще одного раза в год для опытного программиста на Си).

2 голосов
/ 09 ноября 2011

Это не так, printf это. Вы говорите printf, что вы передаете ему две строки ("%s"), тогда как на самом деле вы передаете int и float. Должно быть:

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

В противном случае он будет обрабатывать два аргумента в стеке как строки (т. Е. char*).

Поскольку два char* не были переданы, как было обещано, при попытке вывести значения того, что он считает двумя строками в стеке, это приведет к неопределенному поведению и, возможно, к аварийному завершению. Скорее всего, это потому, что указатели, которые он пытается разыменовать, являются недействительными и фактически не указывают на действительный адрес.

printf не может сказать, верны ли передаваемые вами аргументы, однако предупреждения вашего компилятора будут. Включите предупреждения вашего компилятора.

Прочтите здесь, чтобы узнать больше о параметрах предупреждения с помощью gcc (если вы это используете): http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

Подробнее о спецификаторах формата читайте здесь (т. Е. %s, %d): http://www.cplusplus.com/reference/clibrary/cstdio/printf/

0 голосов
/ 09 ноября 2011

Printf неверен. Измените его на

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

См. Эту ссылку, чтобы четко понять синтаксис printf:

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

...