Показать полную графическую версию : [решено] Вывод массива char из функции
kennydzzze
11-04-2016, 08:42
Не получается вывести значения массива в main, который заполняется внутри функции. Вместо 'a' символов выводит случайные символы.
#include <stdio.h>
#include <stdlib.h>
void f(char *c, int *n)
{
*n=10;
c=(char*)malloc(*n+1);
for(int i=0; i<*n; i++)
{
c[i]='a';
}
}
int main()
{
int a;
char *c;
f(c,&a);
for(int i=0; i<a+1; i++)
{
printf("%c",&c[i]);
}
system("pause");
}
void f(char *c, int *n)»Надо передавать указатель на указатель, если вы хотите его изменять. void f(char **c, int *n)
Соответственно:
c=(char*)malloc(*n+1);»*c = (char*)malloc(*n+1);
c[i]='a';»(*c)[i]='a';
Тут в принципе неверно:
printf("%c",&c[i]);»printf("%c", c[i]);
А еще надо память и освобождать.
И основной вопрос - зачем вам вообще вся эта адресная арифметика?
kennydzzze
11-04-2016, 18:21
Спасибо, помогло.
void f(char **c, int *n) »
Я думал так передаются двумерные динамические массивы, точнее указатели на них.
А еще надо память и освобождать. »
Это да, но тут не думаю, что это нужно, это как образец.
И основной вопрос - зачем вам вообще вся эта адресная арифметика? »
Пишу консольное приложение генератор паролей с функционалом.
п.с. в мейне я тогда должен передавать адрес одномерного массива в функцию? f(&c, &a);
Я думал так передаются двумерные динамические массивы, точнее указатели на них. »Смотря как вы используете это. В вашем случае была проблема - у вас есть переменная типа (char *) вы ее передаете в функцию (в ней это другая - локальная переменная) и внутри нее меняете значение. После выхода функции вы уже работаете с переменной, определенной в контексте метода main(), поэтому, значение не сохраняется.
Это да, но тут не думаю, что это нужно, это как образец. »Привыкайте делать сразу. И продумайте где выделять память и где освобождать.
п.с. в мейне я тогда должен передавать адрес одномерного массива в функцию? f(&c, &a); »Да.
kennydzzze
14-04-2016, 17:49
User001, Не могли бы вы прояснить ситуацию с передачей двумерных динамических массивов? Задача та же самая, нужно передать массив типа char, только уже двумерный, забить значениями и вывести его в main:
#include <stdio.h>
#include <stdlib.h>
void f(char ***c, int *n)
{
*n=10;
*c=(char**)malloc(*n*sizeof(char*));
for (int i=0; i<*n; i++)
{
(*)c[i]=(char*)malloc(5*sizeof(char)); //[Error] expected primary-expression before ')' token
}
for(int i=0; i<*n; i++)
{
(*)c[i]='a'; //[Error] expected primary-expression before ')' token
}
}
int main()
{
int a=0;
char **c;
f(&c,&a);
for(int i=0; i<a; i++)
{
printf("%s\n",c[i]);
}
for (int i=0; i<a; i++)
{
free(c[i]);
}
free(c);
system("pause");
}
Код не компилируется, выводит ошибки на 11 и 16 строки(указал в комментариях кода). Компилятор dev-cpp 5.11
(*)c[i]=(char*)malloc(5*sizeof(char)); »(*c)[i]
(*)c[i]='a'; //[Error] expected primary-expression before ')' token »(*c)[i][j]. Соответственно - внутренний цикл еще один нужен, т.к. массив 2-мерный.
printf("%s\n",c[i]); »printf("%c\n", c[i][j]);
И почините оформление.
kennydzzze
15-04-2016, 11:49
(*c)[i][j] »
Видимо я вчера совсем перенапрягся после учебы... Спасибо.
printf("%c\n", c[i][j]); »
Здесь не вижу никакой ошибки, %s выводит строку [i]. Все норм было.
И почините оформление. »
Какое оформление? Темы? Что не так с ним?
Здесь не вижу никакой ошибки, %s выводит строку [i]. Все норм было. »Я вашей задумки не знаю. Если это массив строк, то не забывайте +1 символ выделять для \0.
Какое оформление? Темы? Что не так с ним? »Я про оформление кода: пробелы после for, константы (5) посреди кода и т.д.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.