kennydzzze |
11-04-2016 08:42 2625015 |
Вывод массива char из функции
Не получается вывести значения массива в main, который заполняется внутри функции. Вместо 'a' символов выводит случайные символы.
PHP код:
#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)
Соответственно:
Код:
*c = (char*)malloc(*n+1);
Тут в принципе неверно:
А еще надо память и освобождать.
И основной вопрос - зачем вам вообще вся эта адресная арифметика?
|
kennydzzze |
11-04-2016 18:21 2625200 |
Спасибо, помогло.
Цитата:
Цитата User001
void f(char **c, int *n) »
|
Я думал так передаются двумерные динамические массивы, точнее указатели на них.
Цитата:
Цитата User001
А еще надо память и освобождать. »
|
Это да, но тут не думаю, что это нужно, это как образец.
Цитата:
Цитата User001
И основной вопрос - зачем вам вообще вся эта адресная арифметика? »
|
Пишу консольное приложение генератор паролей с функционалом.
п.с. в мейне я тогда должен передавать адрес одномерного массива в функцию? f(&c, &a);
|
Цитата:
Цитата kennydzzze
Я думал так передаются двумерные динамические массивы, точнее указатели на них. »
|
Смотря как вы используете это. В вашем случае была проблема - у вас есть переменная типа (char *) вы ее передаете в функцию (в ней это другая - локальная переменная) и внутри нее меняете значение. После выхода функции вы уже работаете с переменной, определенной в контексте метода main(), поэтому, значение не сохраняется.
Цитата:
Цитата kennydzzze
Это да, но тут не думаю, что это нужно, это как образец. »
|
Привыкайте делать сразу. И продумайте где выделять память и где освобождать.
Цитата:
Цитата kennydzzze
п.с. в мейне я тогда должен передавать адрес одномерного массива в функцию? f(&c, &a); »
|
Да.
|
kennydzzze |
14-04-2016 17:49 2626162 |
User001, Не могли бы вы прояснить ситуацию с передачей двумерных динамических массивов? Задача та же самая, нужно передать массив типа char, только уже двумерный, забить значениями и вывести его в main:
PHP код:
#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
|
Цитата:
Цитата kennydzzze
(*)c[i]=(char*)malloc(5*sizeof(char)); »
|
(*c)[i]
Цитата:
Цитата kennydzzze
(*)c[i]='a'; //[Error] expected primary-expression before ')' token »
|
(*c)[i][j]. Соответственно - внутренний цикл еще один нужен, т.к. массив 2-мерный.
printf(" %c\n", c[i][j]);
И почините оформление.
|
kennydzzze |
15-04-2016 11:49 2626406 |
Видимо я вчера совсем перенапрягся после учебы... Спасибо.
Цитата:
Цитата User001
printf("%c\n", c[i][j]); »
|
Здесь не вижу никакой ошибки, %s выводит строку [i]. Все норм было.
Какое оформление? Темы? Что не так с ним?
|
Цитата:
Цитата kennydzzze
Здесь не вижу никакой ошибки, %s выводит строку [i]. Все норм было. »
|
Я вашей задумки не знаю. Если это массив строк, то не забывайте +1 символ выделять для \0.
Цитата:
Цитата kennydzzze
Какое оформление? Темы? Что не так с ним? »
|
Я про оформление кода: пробелы после for, константы (5) посреди кода и т.д.
|
Время: 12:22.
© OSzone.net 2001-