Изучение C с помощью «Системного программирования на C и Unix» Адама Гувера. Я столкнулся с вопросом из главы 4, который меня очень озадачил. Вопрос заключается в следующем:
В следующем коде первая достигнутая функция printf() возвращает "14", но вторая функция printf() может вызвать ошибку шины или ошибку сегментации. Почему?
Оригинальный код из книги:
main()
{
int *p;
funct(p);
printf("%d\n",*p);
}
funct(int *p2)
{
p2=(int *)malloc(4);
*p2=14;
printf("%d\n",*p2);
}
Моя слегка модифицированная "отладочная" (printf все) версия:
#include <stdio.h>
#include <stdlib.h>
void funct(int *p2);
int main(){
int *p;
printf("main p - address: %p\n", p);
funct(p);
printf("main p - address: %p\n", p);
printf("main p value: %d\n", *p);
}
void funct(int *p2){
printf("funct (pre malloc) p2 - address: %p\n", p2);
p2 = (int *)malloc(4);
printf("funct (post malloc) p2 - address: %p\n", p2);
*p2 = 14;
printf("funct p2 value: %d\n", *p2);
}
Я скомпилировал этот образец, используя как gcc, так и clang (в Ubuntu Linux), и clang не выдает сбой seg для кода, который должен делать именно это. Я ломал голову над этим какое-то время и не могу представить, почему и как это происходит. Любое понимание приветствуется.
Спасибо.
p2=(int *)malloc(4);
недостаточно велик. - person Mysticial   schedule 19.09.2011main()
. Разыменование неинициализированного указателя — это UB. UB означает, что он может дать сбой, а может и нет. - person Alok Save   schedule 19.09.2011p
(&p
), если нужно изменить его вfunct()
. - person Michael Foukarakis   schedule 19.09.2011