Инициализация массива указателей на символ - PullRequest
3 голосов
/ 19 июля 2009

Когда я пытаюсь скомпилировать следующий код, я получаю сообщение об ошибке: «Введите в аргументе 1 ошибку« allocate »; найдено значение char * *», ожидаемое значение char * »в указанной строке (<<<<<) , Пояснения будут оценены. </p>

#include <stdio.h>
#include <string.h>

void allocate(char *dt);

int  main(void)
{
  char *data[3];

  allocate(data); <<<<<
    return 0;
}

void allocate(char *dt)
{ 
  int i;
  char buf[] = "A test string";

  for (i = 0; i < 3; i++){
    strcpy(&dt[i], buf);
    printf("%s\n", dt[i]);
  }
} 

Насколько я понимаю, я должен вызывать allocate таким образом: allocate (& data), но при этом я получаю следующую ошибку: "Введите в аргументе 1 ошибку" allocate "; найдено 'char * (*) [3]", ожидаемый 'char *' ".

Должно быть очевидно, что я пытаюсь сделать содержимое * data [] == buf. * ​​1006 *

Ответы [ 3 ]

4 голосов
/ 19 июля 2009

Похоже, что allocate пытается динамически выделить три строки и назначить их каждому члену массива из трех char* указателей.

Массивы распадаются на указатели, когда вы передаете их как аргументы функции, что вам и нужно, поэтому объявление allocate должно быть void allocate(char**). Передача data передаст указатель на первый элемент массива, то есть указатель на char*.

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

Конечно, в этот момент вам, вероятно, понадобится функция deallocate и убедитесь, что она всегда вызывается для выполнения соответствующего free для новых malloc s.

void allocate(char** dt)
{ 
    int i;
    size_t len;

    char buf[] = "A test string";
    len = sizeof buf;

    for (i = 0; i < 3; i++)
    {
        dt[i] = malloc(len);
        if (dt[i] != NULL)
        {
            memcpy(dt[i], buf, len);
            printf("%s\n", dt[i]);
        }
    }
}
0 голосов
/ 19 июля 2009

Главное правильно. Это неправильно.

Просто измените

void allocate(char *dt)

до

void allocate(char **dt)

или (эквивалентно)

void allocate(char *dt[])

Аргументом для выделения является логически «Массив строк», который совпадает с «Массивом указателей на символы», который (с точки зрения аргумента) совпадает с «Указателем на указатель на символ» .

0 голосов
/ 19 июля 2009

Проблема в объявлении переменных данных. Вы указали как указатель (*), так и массив ([]). Фактический тип данных - это массив значений указателей.

Для этой конкретной перегрузки массив действует как другой указатель, поэтому у вас есть указатель на символ в данных (char**). Функция allocate ожидает одно значение указателя.

Это можно исправить, исключив указатель в объявлении типа данных.

char data[3];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...