2013-12-05 3 views
2

Я должен реализовать функцию, которая возвращает адрес памяти указателя, когда я выделяю его malloc(). Я знаю, что malloc(value) выделяет область на куче размером value.Сохранить адрес памяти указателя

Я знаю, как реализовать код для печати адреса памяти этого указателя:

void *s = malloc (size) 
    printf("%p\n",s); 

Мой вопрос, как я могу сохранить значение напечатанный этим кодом в междунар или строки? Могу ли я? Я сожалею, если это глупый вопрос ...

+1

Что вы собираетесь с этим делать? Вам просто нужна строка для печати? Это всего лишь массив символов, как любая другая строка. Или вы пытаетесь сохранить значение самого указателя? Это просто 's'. – Joe

ответ

4

Сохранение значения указателя (т.е. ячейки памяти некоторой переменной) в строке может быть сделано так же, как вы использовали Printf:

char buf[128]; 
void *s = malloc (size); 
sprintf(buf, "%p\n",s); 

для того, чтобы «спасти» значение в целое число (типа), вы можете сделать простой бросок:

void *s = malloc (size); 
size_t int_value = (size_t)s; 

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

+0

Не будет работать для «возвращаемого» значения из функции, так как 'buf' не будет существовать после возврата функции. – Floris

+0

@Floris Да .. но это становится немного педантичным. Маркос Хорро Варела не просил такого качества. – Rooke

+0

Я думал, что вопрос начался с «Я должен реализовать _функцию, которая возвращает адрес памяти указателя_, когда я выделяю его с помощью malloc()». Мы интерпретировали это по-разному, очевидно. – Floris

3
char buf[32] = {0} 
snprintf(buf, sizeof buf, "%p\n", s); 

, то вы можете распечатать его:

printf("%s\n", buf); 
2

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

char text[255]; 
sprintf(text, "%p\n", s); 
1

Если вы хотите, чтобы адрес указателя вернулся из вашей функции, вы можете объявить функцию, чтобы вернуть тип указателя:

int* myFunc(int n) { 
    int* p; 
    p = malloc(n*sizeof(int)); 
    // more stuff 
    return p; 
} 

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

Возьмите с собой.

Обратите внимание, что на некоторых системах int не будут большими прийти провести тип int* данных - с помощью int* не только понятнее, но безопаснее, а также.

0

Да sprintf() - лучший вариант. Здесь вы можете просто взять любую вещь внутри строки.

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