передавая символьный указатель на функцию в C. только первая позиция занята - PullRequest
0 голосов
/ 18 января 2019

У меня крошечная проблема. Я хочу передать строку (символьный указатель) в функцию. В функции я могу просто передать первую позицию указателя на символ.

Вот код-фрагмент:

void put(struct DataItem* hashArray[SIZE], char* key){
struct DataItem* item = malloc(sizeof(struct DataItem));
item->key = *key;
item->value = 1; 

Итак, когда я вызываю отладчик и проверяю значение «item-> key». Тогда это просто первая позиция указателя на символ.

Например, я прохожу "524234" Тогда пункт-> ключ просто "5"

EDIT:
Спасибо за ответ

Вы имеете в виду, что я должен использовать strcpy вот так

void put(struct DataItem* hashArray[SIZE], char* key){
struct DataItem* item = malloc(sizeof(struct DataItem));
strcpy(item->key,key);
item->value = 1;

это не работает. даже если я попробую с указателем, как это

void put(struct DataItem* hashArray[SIZE], char* key){
struct DataItem* item = malloc(sizeof(struct DataItem));
strcpy(item->key,*key);
item->value = 1;

В первой ситуации компилятор говорит

16: предупреждение: передача аргумента 1 из 'strcpy' делает указатель из целого числа без приведения [-Wint-преобразование]

Во второй ситуации (с *). компилятор говорит:

16: предупреждение: передача аргумента 1 из 'strcpy' делает указатель из целого числа без приведения [-Wint-преобразование]

предупреждение: передача аргумента 1 в 'strcpy' делает указатель из целого числа без приведения [-Wint-преобразование]

РЕДАКТИРОВАТЬ:

Вот структура DataItem

struct DataItem {
    char key;
    int value;
};

1 Ответ

0 голосов
/ 18 января 2019

Ваш "struct DataItem" имеет хранилище для ОДНОГО одиночного символа. У него нет хранилища для строки.

Итак, сначала вам нужен символ *, а не символ.

struct DataItem {
    char* key;
    int value;
};

Теперь у нас есть проблема, что кто-то должен взять на себя ответственность за создание и удаление ключей. Я предлагаю сначала создать typedef для DataItem, облегчая жизнь:

typedef struct {
    char* key;
    int value;
} DataItem;

Затем вы пишете две функции, подобные этой:

DataItem* CreateDataItem (char* key, int value) {
    DataItem* item = malloc (sizeof (DataItem));
    char* copyKey = malloc (strlen (key) + 1);
    strcpy (copyKey, key);
    item->key = copyKey;
    item->value = value;
    return item;
}

void DestroyDataItem (DataItem* item) {
    free (item->key);
    free (item);
}

А теперь вы создаете такой предмет:

DataItem* item = CreateDataItem (key, 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...