Ошибка неверного преобразования из 'void *' в 'char *' - PullRequest
0 голосов
/ 05 февраля 2019

Пробовал смотреть на прошлые вопросы, касающиеся этой проблемы, но кажется, что все они касаются C ++, а не C. И я должен написать программу на C. Итак, у меня есть эта часть кода, которая должна выполнять следующее:существующая строка kstring, на которую указывает strp, должна быть длиной не менее n байтов ... И так далее.Но у меня есть код для функции, но я продолжаю получать сообщение об ошибке: недопустимое преобразование из 'void *' в 'char *'.

typedef struct
    {
        char *data;
        size_t length;
    } kstring; 

Функция:

void kstrextend(kstring *strp, size_t nbytes)
{
    char *nwData;
    int lnth=strp->length;
    if(lnth < nbytes)
    {
        // new array allocate with large size and copy data to new array
        nwData = realloc(strp->data, nbytes);
        // call abort in case of error
        if(nwData == NULL)
        {
            abort();
        }
        //Making strp->data point to the new array
        strp->data = nwData;
        //Setting strp->length to the new size.
        strp->length = nbytes;
        // filled with '\0' in remaining space of new array
        for (int lp = lnth; lp < nbytes; lp++)
        {
            strp->data[lp] = '\0';
        }
    }
}

Часть основного места, где вызывается функция:

name.data = (char*)calloc(sizeof("Hello"), 1);
strcpy(input, "Hello");
name.length=5;
kstrextend(&name,40);
printf("%s %d",name.data,name.length);

1 Ответ

0 голосов
/ 05 февраля 2019

Проблема в том, что вы вызываете realloc:

// new array allocate with large size and copy data to new array
nwData = realloc(strp->data, nbytes);

nwData имеет тип char *, но realloc возвращает void *.См. https://en.cppreference.com/w/c/memory/realloc для получения дополнительной информации.Вместо этого вы должны привести к char *, как при настройке name.data:

nwData = (char *)realloc(strp->data, nbytes);

Я предполагаю, что вы компилируете с g ++?Если вы пишете программу на C, вы должны скомпилировать с помощью gcc, который будет компилироваться в соответствии с семантикой языка C, а не C ++.

В качестве примечания, я вижу, что вы вручную устанавливаете оставшуюся часть массива\0 в цикле:

// filled with '\0' in remaining space of new array
for (int lp = lnth; lp < nbytes; lp++)
{
    strp->data[lp] = '\0';
}

Как правило, гораздо быстрее (и лучший стиль кода) использовать встроенную функцию memcpy вместо цикла:

memset(strp->data + lnth, nbytes - lnth, '\0');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...