как сохранить содержимое переменной в const char *?

#c

#c

Вопрос:

у меня есть указатель или переменная, в которой хранится адрес, подобный 0xb72b218 теперь я должен сохранить это значение в to const char* . как я могу это сохранить. Заранее спасибо. Я попробовал следующее: предположим, у меня есть переменная-указатель «ptr», которая содержит 0xb72b218 значение

 ostringstream oss;
oss << ptr;
string buf = oss.str();
const char* value = buf.c_str();
  

но это сложнее, любой знает простой способ.

Комментарии:

1. Хранить значения таким образом необычно — можете ли вы пояснить, почему вам нужно это делать?

2. @trojanfoe мне нужно передать аргумент const char * другой функции. прототип функции исправлен.

3. Я думаю, что stringstream упрощает вашу задачу, а не усложняет.

4. Какой функции вам нужно передать const char* ?

Ответ №1:

Ну … если вам действительно нужен адрес чего-либо в строке, этого будет достаточно:

 #include <stdio.h>
#include <iostream>

int main(){
  char buf[30];
  void* ptr = /*your pointer here*/;
  snprintf(buf,sizeof(buf),"%p",ptr);

  std::cout << "pointer as string: " << buf << "n";
  std::cout << "pointer as value: " << ptr << "n";
}
  

Или, если вам не нравятся магические числа и вы хотите, чтобы ваш код работал, даже когда 256-битные указатели больше не представляют собой ничего особенного, попробуйте это:

 #include <limits>  // for numeric_limits<T>
#include <stdint.h>  // for intptr_t
#include <stdio.h>  // for snprintf
#include <iostream>

int main(){
  int i;
  int* ptr = amp;i; // replace with your pointer
  const int N = std::numeric_limits<intptr_t>::digits;
  char buf[N 1]; //  1 for '' terminator
  snprintf(buf,N,"%p",ptr);

  std::cout << "pointer as string: " << buf << "n";
  std::cout << "pointer as value: " << static_cast<void*>(ptr) << "n";
}
  

Пример на Ideone.

Комментарии:

1. @Konrad: Ты имеешь в виду размер буфера? Ну да, это был просто пример. Это могло бы усложнить numeric_limits хакерство. 😛

2. @Xeo Точно. Если вы настаиваете на статическом буфере и snprintf , то вам следует использовать numeric_limits для извлечения правильного размера буфера.

3. Разве это не должно быть char buf[N 1], 1 для завершения null?

4. @luke: Оооопс, ты этого не видел! 😉

5. Насколько это менее сложно, чем оригинальное решение, которое OP предлагает в своем вопросе?

Ответ №2:

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

 extern void afunc(const char *p, int type);

int value = 1234;
afunc((const char *)amp;value, TYPE_INT);
  

Комментарии:

1. @Konrad: Возможно, так и было, и спрашивающий неправильно понял проблему. Может быть, ему нужно передать указатель на функцию, которая работает с байтами? Кто знает, вот почему я сделал этот комментарий к вопросу.

Ответ №3:

Вы смотрели const_cast ? Это средство добавления / удаления постоянства из переменной в C . Взгляните сюда.

Комментарии:

1. Какое это имеет отношение к делу? Вопрос не в const несс и даже не в приведении.