У меня есть библиотека my_lib с функцией C, которая принимает параметр char***, указатель на массив char*, выделенный функцией. Вот минимальный воспроизводимый пример такой функции:
void getArrayOfStrings(char*** paramPtr)
{
(*paramPtr) = (char**) malloc(3*sizeof(char*));
(*paramPtr)[0] = (char*) malloc(strlen("Foo")+1);
strcpy((*paramPtr)[0], "Foo");
(*paramPtr)[1] = (char*) malloc(strlen("Bar")+1);
strcpy((*paramPtr)[1], "Bar");
(*paramPtr)[2] = 0;
}
Он устанавливает последний элемент массива в 0, чтобы вызывающий объект мог его идентифицировать (вместо того, чтобы указывать размер в качестве второго параметра). Обратите внимание, что для освобождения памяти предусмотрена отдельная функция.
Я запускаю ctypesgen, чтобы сгенерировать привязку Python к этой функции. Он генерирует этот код:
getArrayOfStrings = _lib.get("getArrayOfStrings", "cdecl")
getArrayOfStrings.argtypes = [POINTER(POINTER(POINTER(c_char)))]
getArrayOfStrings.restype = None
Эту сгенерированную привязку можно вызвать из приведенного ниже сценария Python:
import my_lib
import ctypes
names = ctypes.POINTER(ctypes.POINTER(ctypes.c_char))()
my_lib.getArrayOfStrings(names)
if names:
for name in names:
name_str = my_lib.String(name)
if name_str:
print("Got name: " + str(name_str))
else:
break
Он отлично работает и печатает «Foo\nBar\n»
Мне просто интересно, зачем использовать ctypes.POINTER(ctypes.POINTER( ctypes.c_char)), который я понимаю как «указатель на указатель на char», поэтому char** работает. Почему мне не следует использовать ctypes.POINTER(ctypes.POINTER(ctypes.POINTER(ctypes.c_char)))?
Я тестировал ctypes.POINTER(ctypes. POINTER(ctypes.POINTER(ctypes.c_char))), тот же код выдает ошибку:
my_lib.getArrayOfStrings(names)
OSError: exception: access violation writing 0x0000000000000000
Подробнее здесь: https://stackoverflow.com/questions/793 ... types-poin
Почему двойной объект `ctypes.POINTER` работает для `char***`, а тройной `ctypes.POINTER` имел бы больше смысла? ⇐ Python
Программы на Python
1737324745
Anonymous
У меня есть библиотека my_lib с функцией C, которая принимает параметр char***, указатель на массив char*, выделенный функцией. Вот минимальный воспроизводимый пример такой функции:
void getArrayOfStrings(char*** paramPtr)
{
(*paramPtr) = (char**) malloc(3*sizeof(char*));
(*paramPtr)[0] = (char*) malloc(strlen("Foo")+1);
strcpy((*paramPtr)[0], "Foo");
(*paramPtr)[1] = (char*) malloc(strlen("Bar")+1);
strcpy((*paramPtr)[1], "Bar");
(*paramPtr)[2] = 0;
}
Он устанавливает последний элемент массива в 0, чтобы вызывающий объект мог его идентифицировать (вместо того, чтобы указывать размер в качестве второго параметра). Обратите внимание, что для освобождения памяти предусмотрена отдельная функция.
Я запускаю ctypesgen, чтобы сгенерировать привязку Python к этой функции. Он генерирует этот код:
getArrayOfStrings = _lib.get("getArrayOfStrings", "cdecl")
getArrayOfStrings.argtypes = [POINTER(POINTER(POINTER(c_char)))]
getArrayOfStrings.restype = None
Эту сгенерированную привязку можно вызвать из приведенного ниже сценария Python:
import my_lib
import ctypes
names = ctypes.POINTER(ctypes.POINTER(ctypes.c_char))()
my_lib.getArrayOfStrings(names)
if names:
for name in names:
name_str = my_lib.String(name)
if name_str:
print("Got name: " + str(name_str))
else:
break
Он отлично работает и печатает «Foo\nBar\n»
Мне просто интересно, зачем использовать ctypes.POINTER(ctypes.POINTER( ctypes.c_char)), который я понимаю как «указатель на указатель на char», поэтому char** работает. Почему мне не следует использовать ctypes.POINTER(ctypes.POINTER(ctypes.POINTER(ctypes.c_char)))?
Я тестировал ctypes.POINTER(ctypes. POINTER(ctypes.POINTER(ctypes.c_char))), тот же код выдает ошибку:
my_lib.getArrayOfStrings(names)
OSError: exception: access violation writing 0x0000000000000000
Подробнее здесь: [url]https://stackoverflow.com/questions/79369858/why-double-ctypes-pointer-object-works-for-char-while-triple-ctypes-poin[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия