2009-12-25 17 views
0

Я пытаюсь выяснить ответ на этот вопрос со следующим кодом, но, оказывается, значение указателя (адрес проблемы3 оказалось настолько далеким от параметра и локальные переменные функции), где ад является x = problem3; указывающего на ...Кастинг числовых типов в C

void problem3(int a) { 
    int overflowme[16]; 
    int x = problem3; 
    overflowme[15] = 102; 
    printf(" the address of x is %x\n the addres of the first local is %x\n the addres of the first para is %x\n ", x, &overflowme[15], &a); 
} 

int main(void) { 
    problem3(101); 
} 

OUTPUT 
the address of x is 42b613 
the addres of the first local is 12fed8 
the addres of the first para is 12fee4 
Press any key to continue . . . 
+1

Я не вижу, как здесь 'overflowme' имеет какую-либо цель , –

+0

И это должно быть 'int main (void)'; в стандарте C основная функция возвращает int. –

+0

Вы пытаетесь что-то сделать или просто экспериментировать с тем, что C может сделать? – MatrixFrog

ответ

2

Можете ли вы объяснить, почему мы позволили присвоить х = (INT) проблем3 в приведенном выше коде

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

Не присваиваем ли мы «мир привет» х?

Нет, но вы могли бы сделать это, если вы хотите (делая x = (int) "hello world";), потому что «привет мир» также указатель (полукокса указатель, чтобы быть точным), поэтому выше относится.

+0

Что произойдет, если мы не будем задавать проблему с типом3 перед назначением? – user133466

+0

вы, вероятно, получите предупреждение о компиляторе (или ошибке?), Например, «назначение от указателя на целое без приведения» –

4

проблем3 является указателем на функцию. В C, если вы используете листинг, подобный (int), компилятор в основном отключает проверку всех типов и предполагает, что вы знаете, что вы делаете (даже если, как в этом случае, это бессмысленно) - в этом случае преобразование указателя на целое число.

Нижняя линия - не используйте отливки, если вам действительно не нужно.

+0

im abit confused ... как может problem3 быть указателем? мы никогда не объявляли int * problem3 ... – user133466

+0

и, вероятно, усекали адрес, если указатель больше, чем тип int, например. 64-разрядная платформа – Anycorn

+2

Имя функции является указателем на эту функцию. – 2009-12-25 21:49:31

0

Во-первых, вам не хватает скобки в problem3;, чтобы фактически выполнить вызов функции. Во-вторых, присвоение x = (int)problem3 присваивает адресу функции problem3 x, отбрасывается в int. Это совершенно легальное дело в C, хотя я не уверен, чего вы пытаетесь достичь.

Если вы печатаете адрес функции, переданной в int, и отформатируете ее как шестнадцатеричное число, вы, скорее всего, напечатаете адрес функции в виде шестнадцатеричного числа. Я не уверен, почему вы удивлены тем, что число имеет 7 цифр.

+0

Вопрос отредактирован, чтобы ответить на ваш первый комментарий - так как это не было актуальным для обсуждаемой проблемы. –

0

В первом примере вы назначаете адрес своей problem3 функции x, а затем печатаете значение этого адреса.

Литье до int, как правило, совершенно бесполезно. Вам редко нужно знать фактический адрес памяти функции.

Единственный момент, когда вы захотите получить адрес функции, - это когда вы хотите передать ее другим частям вашего кода, которые будут вызывать функцию (выполнить ее). Для получения дополнительной информации об использовании указателей функций обратитесь к this article.

0

Вы печатаете адреса функций («problem3» и «main»). Эти адреса полностью зависят от компилятора и реализации, поэтому разница между 6 и 7 цифрами, с которыми вы сталкиваетесь.

1

Кастинг (то, что вы делаете, когда вы кладете (int) перед чем-то), магически так. Это займет какое-то дело и превратит его в что-то другое (int в этом случае) независимо от того, имеет ли он смысл. Вам следует избегать использования кастингов, если вы абсолютно не уверены, что вам нужно, и другого пути нет.

Код вашей программы существует в памяти, как и переменные.То, что происходит здесь, заключается в том, что приведение приводит к тому, что число, которое представляет, где в памяти код находится в целое число. Это целое число может быть больше или меньше, в зависимости от того, где в памяти компилятор и компоновщик решили поместить код для функции.

Ваш оператор printf вообще не выполняет никаких заданий. %x является просто заполнителем, говорящим «Возьмите один из параметров, переданных printf, и распечатайте здесь». Тот факт, что это «x», не имеет ничего общего с именем переменной в вашей программе. Что означает «x»: «Распечатайте это целое число в базе 16 (heXadecimal) вместо обычной базы 10.». Если вы положите %u или %d, он все равно будет работать, и вы выберете число, представленное в виде целых чисел без знака, на основе 10 или целое число со знаком в базе 10.

Смежные вопросы