Печать адресов указателей в C [два вопроса]

Я знаю, что мои вопросы очень простые, но гугление их не дало мне никаких полезных результатов... Наверное, они слишком простые!!!

№ 1

char* createStr(){
    char* str1 = malloc(10 * sizeof(char));
    printf("str1 address in memory : %p\n", &str1);
    return str1;
}

int main(void){
    char* str2 = createStr();
    printf("str2 address in memory : %p\n", &str2);
}

Результат:

str1 address in memory : 0x7fffed611fc8
str2 address in memory : 0x7fffed611fe8

Почему адреса разные в функции createStr() и вне ее и как я могу освободить(str1)??????

№2

int main(int argc, int *argv[]){
    printf("Basename is %s ", (char*) argv[0]);
    if(argc > 1 ){
        printf("and integer arg is : %d.\n", (int) *argv[1]);
    }
}

Если я скомпилирую и запущу $ ./test 3, как я могу получить int 3?

Результат:

Basename is ./test and integer arg is : 1380909107.
9
задан ArjunShankar 22 December 2011 в 13:44
поделиться