Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.10.2021, 21:41   #1
Sasha2401b
Новичок
Джуниор
 
Регистрация: 17.10.2021
Сообщений: 2
По умолчанию Язык Си, вернуть указатель на выделенную память (malloc()) на массив указателей на char через аргументы функции.

Доброго времени суток. Это не задача как для студентов, поскольку я использую это в образовательных целях буду думать что ветку форума выбрал правильно.
Код:
int main() {
	char** j = NULL;
	int n = 3;
	char* s[] = { "test", "test1","test3" };
	
	test(&j, s);

	if (j != NULL)
		for (int i = 0; i < 3; ++i) {
			printf("%s -- >%p\n", j[i], j[i]);
			free(j[i]);
		}
	free(j);
}

int test(char*** m, char** s) {
	int i, n = 3, x = 0;
	char* d;
	*m= (char**)malloc(n * sizeof(char*));
	for (i = 0; i < n; ++i) {
		d = (char*)malloc(6);
		strcpy(d, s[i]);
		m[x++] = d;
	}
	for (int i = 0; i < 3; ++i)
		printf("%s -- >%p\n", m[i], m[i]);

	return x;
}
Я код прилагаю, хотя думаю в данном вопросе он не особо важен . А вопрос звучит так, как можно вернуть через аргумент функции адрес выделенной памяти malloc на массив указателей типа char. P.s. через return я сделал, и через передачу уже выделенного участка памяти (j =(char**)malloc(n * sizeof(char*) -в main())) – то же сделал.
Sasha2401b вне форума Ответить с цитированием
Старый 17.10.2021, 21:55   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void test(char*** m, char** s, int n) {
    *m = (char**)malloc(n * sizeof(char*));
    for (int i = 0; i < n; ++i) {
        char* d = (char*)malloc(6);
        strcpy(d, s[i]);
        (*m)[i] = d;
    }
    for (int i = 0; i < n; ++i)
        printf("%s -- >%p\n", (*m)[i], (*m)[i]);
}

int main(void) {
    char** j = NULL;
    int n = 3;
    char* s[] = {"test", "test1", "test3"};
    
    test(&j, s, n);

    if (j != NULL) {
        for (int i = 0; i < n; ++i) {
            printf("%s -- >%p\n", j[i], j[i]);
            free(j[i]);
        }
        free(j);
    }
    return 0;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.10.2021, 22:37   #3
Sasha2401b
Новичок
Джуниор
 
Регистрация: 17.10.2021
Сообщений: 2
По умолчанию

Спасибо BDA. главная строка эта (*m)[i] = d; Мало опыта с указателями. Я уже когда смотрю на готовую строчку, ну всю ж понятно, разименовали обратились по индексу к значению и присвоили. Но сам не додумал.
Всё что додумал, создал ещё одну перменую char ** tmp;
а перед return, *m=tmp; но ваш вариант на много, много лучше. Ещё раз спасибо
Sasha2401b вне форума Ответить с цитированием
Старый 17.10.2021, 23:03   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от Sasha2401b Посмотреть сообщение
создал ещё одну переменную char ** tmp;
Тоже неплохой вариант, чтобы постоянно не разыменовывать.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вернуть массив указателей на структуры из функции elvy Общие вопросы C/C++ 3 28.02.2019 21:35
Вернуть указатель на массив из функции Rebelition Общие вопросы C/C++ 3 25.06.2013 01:37
Список указателей(TList). Как 100%-о вернуть не nil, указатель. Человек_Борща Общие вопросы Delphi 16 12.01.2012 11:56
Указатель на массив указателей на массив char'ов... SrgGld Общие вопросы C/C++ 0 19.11.2010 23:35
Создать массив в функции, через указатель. Как? TwiX Общие вопросы Delphi 10 01.04.2010 11:36