Хранение целых чисел в char *

0

Я начинаю с чего-то пытаюсь. Как я могу передать целочисленный массив функции, ожидающей char * в c/c++, поскольку диапазон char - это только -128 до 127, но я хочу хранить числа из целого диапазона целых чисел.

Вот что я пытался:

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

int size = 12;

void print(char* array){

    int i,j;
    for(i=0;i<size;i++)
        for(j=0;j<size;j++)
            printf("%d ",*(array+i*size+j));

    printf("\n");
}

int main(){

    int array[size][size];
    int i=0,j=0,k=0;

    for(i=0;i<size;i++)
        for(j=0;j<size;j++)
            array[i][j]=k++;

    for(i=0;i<size;i++)
        for(j=0;j<size;j++)
            printf("%d ",array[i][j]);

    printf("\n");    

    print((char *) array);

    return 0;
}

Когда массив печатается внутри основной функции, выход является правильным (цифры 0-143), но внутри функции print() выход

0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 0 11 0 0 0 12 0 0 0 13 0 0 0 14 0 0 0 15 0 0 0 16 0 0 0 17 0 0 0 18 0 0 0 19 0 0 0 20 0 0 0 21 0 0 0 22 0 0 0 23 0 0 0 24 0 0 0 25 0 0 0 26 0 0 0 27 0 0 0 28 0 0 0 29 0 0 0 30 0 0 0 31 0 0 0 32 0 0 0 33 0 0 0 34 0 0 0 35 0 0 0

Я не знаю, что я делаю неправильно.

PS Мне это нужно, так как я использую Apache Zookeeper, а набор и функции get требуют аргументов типа char * для ваших данных.

  • 3
    Ваш вопрос неясен. Почему вы хотите передать массив целых чисел в функцию, ожидающую некоторую строку (часто представленную как char* в C)? Покажите код, пожалуйста. Я полагаю, вы что-то неправильно поняли.
  • 0
    Да, я добавил немного кода сейчас. Мне нужно, чтобы целочисленный массив был сохранен в узле zookeeper. Функция для этого ожидает аргумент char *. Разве это не возможно?
Показать ещё 1 комментарий
Теги:
apache-zookeeper

5 ответов

2

Точно так же вы можете использовать любой массив или указатель при использовании, например, send for sockets: вы наводите указатель.

подобно

int data[DATA_SIZE];

...

send(s, (const char *) data, sizeof(data), 0);

Это очень часто, так как многие функции принимают указатель на char даже для общих данных. Большой вопрос в том, что делает функция с данными.

  • 1
    Для C это довольно плохой пример, так как send() принимает const void * указатель на данные для отправки. И, конечно же, вам никогда не нужно приводить указатель на void * в C.
  • 0
    @unwind В Windows send прежнему принимает символьный указатель. И я связал с MSDN ссылку send .
2

C и C++ - разные языки.

"Целочисленный массив" не является типом C. Пожалуйста, укажите, например:

int my_array[42];

Вы не передавать массивы, в C. Если это не является операндом SizeOf, унарный & или _Alignof операторы, или используется в качестве инициализатора, выражение с типом массива определяет значение указателя на первый элемент массива. См. "Распад массива" по адресу http://www.iso-9899.info/wiki/Code_snippets.

В C вы всегда можете указывать указатель на любой полный или неполный тип объекта указателю на char *. int * - указатель на полный тип объекта. Зная эти факты, действует следующий код внутри тела функции:

int my_array[42];
char * what_i_want;

what_i_want = (char *) my_array;

Затем вы можете передать значение "what_i_want" любой функции, принимающей аргумент char *.

Сказав это, вам нужно понять, что ожидает функция. Поделитесь функцией и некоторым фактическим кодом, тогда, возможно, кто-то сможет предложить более глубокое понимание того, как достичь своей цели.

  • 1
    Спасибо за ответ. Я добавил пример кода сейчас.
  • 0
    Не за что, и я надеюсь, что это поможет. Пока вы не поделитесь, какая функция в «Apache Zookeeper» ожидает аргумент «char *», я не знаю, кто-либо сможет подтвердить лучший способ достижения вашей цели.
0

char * также может использоваться для указания на строку, поэтому вы можете попробовать использовать соответствующие функции преобразования (int → string, string → int) для их передачи.

Если вы отправляете код, я могу попытаться предоставить более подробный ответ.

  • 1
    Спасибо за ответ. Я добавил пример кода сейчас.
0

Char * - это единственный тип указателя, но вы можете предоставить эту функцию всем, что хотите. Вы можете сделать что-то вроде этого:

void func(char* aPointer)
{
int* arr = (int*)aPointer;
int firstInt = *arr;
...
}

Конечно, это очень жестокий способ, поэтому в этом случае вы должны быть очень осторожны, выполнять некоторые проверки и так далее.

  • 1
    Нет, это не работает, потому что это нарушает строгое правило наложения имен.
  • 0
    @TheParamagnCroissant Но не является ли char точно исключением из строгого правила наложения имен?
Показать ещё 1 комментарий
0
void func(char* c)
{
...
}

int x[5] = {1,2,3,4,5};
func((char*)x);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню