2013-03-22 4 views
0

Вот код:Сдал параметр изменяется значение

#include <stdio.h> 
#include <stdlib.h> 

void foo(int* ptr) { 
    printf("ptr is %x\n", ptr); 
} 

void main() { 
    int* ptr = (int*)malloc(sizeof(int)); 
    printf("ptr is %x\n", ptr); 
    foo(ptr); 
    free(ptr); 
} 

... И he're выход:

ptr is 0x007446c0 
ptr is 0x00000000 

... И вот вопрос:
Почему это происходит мне???

+0

рискуя быть одной и той же сломанной записью, все остальные, не бросать malloc() в C - использовать «int * ptr = malloc (sizeof (int)); –

+0

@KScottPiel Почему? –

+0

@ Jacob Spire Смотрите это: http://stackoverflow.com/questions/1565496/specifically-whats-dangerous-about-casting-the-result-of-malloc –

ответ

1

Потому что ваша программа вызывает неопределенное поведение, я полагаю. Вот что, по вашему мнению, вы имели в виду:

#include <stdio.h> 
#include <stdlib.h> 

void foo(int* ptr) { 
    printf("ptr is %p\n", (void *) ptr); /* %x tells printf to expect an unsigned int. ptr is not an unsigned int. %p tells printf to expect a void *, which looks a little better, yeh? */ 
} 

int main() { /* main ALWAYS returns int... ALWAYS! */ 
    int* ptr = malloc(sizeof(int)); /* There is no need to cast malloc. Stop using a C++ compiler to compile C. */ 
    printf("ptr is %p\n", (void *) ptr); 
    foo(ptr); 
    free(ptr); 
} 

Это исправить вашу проблему?

3

Это происходит потому, что %x в printf ожидает целое число без знака, а не указатель.

Вот как исправить вашу программу, чтобы получить поведение, которое вы хотите:

#include <stdio.h> 
#include <stdlib.h> 

void foo(int* ptr) { 
    printf("ptr is %p\n", (void*)ptr); 
} 

int main() { 
    int* ptr = malloc(sizeof(int)); 
    printf("ptr is %p\n", (void*)ptr); 
    foo(ptr); 
    free(ptr); 
    return 0; 
} 

Вот link to ideone; прогон дает ожидаемый результат:

ptr is 0x8fa3008 
ptr is 0x8fa3008 
+0

Я пробовал оригинальную программу с '% x', и она отлично работает без каких-либо проблем. Я пробовал как «gcc (MinGW)», так и «Visual C++ 2010 Express», и он был успешным в обеих средах. Почему «% x» печатает 0x0, а не какой-то номер мусора? – Ganesh

+1

@Ganesh Это опасность неопределенного поведения: иногда он производит «правильную вещь». Одна из причин, по которой «% x» может печатать ноль, будет 64-битным адресом: верхняя половина может быть очень нулевой. – dasblinkenlight

+0

@Ganesh: Вы все еще используете 32-битную среду? Хммм ... – Sebivor