Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 21.04.2016
Сообщений: 161
1

Выделение памяти в функции

26.05.2016, 22:13. Показов 800. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Кто-нибудь знает почему при выделении памяти в функции set для массива b выводит
`S)
`S)
`S)
Duality isn't what it used to be.
Duality isn't what it used to be.
Duality isn't what it used to be.
Duality isn't what it used to be.
Done

а без выделения:
Reality isn't what it used to be.
Reality isn't what it used to be.
Reality isn't what it used to be.
Duality isn't what it used to be.
Duality isn't what it used to be.
Duality isn't what it used to be.
Duality isn't what it used to be.
Done

Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
 
struct stringy 
{
    char * str;
    int ct;
};
void set(stringy &, char b[]);
void show(stringy &, int);
void show(stringy &);
void show(char[], int);
void show(char[]);
int main()
{
    stringy beany;
    char testing[] = "Reality isn't what it used to be.";
    set(beany, testing);
    show(beany);
    show(beany, 2);
    testing[0] = 'D';
    testing[1] = 'u';
    show(testing);
    show(testing, 3);
    show("Done");
    delete beany.str;
    std::cin.get();
    return 0;
}
 
void set(stringy & a, char b[])
{
    b = new char[50];
    a.str = b;
    a.ct = 2;
}
 
void show(stringy & a, int b = 1)
{
    for(int i = 0; i < b; i++)
    std::cout << a.str << std::endl;
}
 
void show(char a[], int b = 1) 
{
    for(int i = 0; i < b; i++)
    std::cout << a << std::endl;
}
void show(char a[]) 
{
    std::cout << a << std::endl;
}
void show(stringy & a)
{
    std::cout << a.str << std::endl;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.05.2016, 22:13
Ответы с готовыми решениями:

Динамическое выделение памяти внутри функции (что вернуть из функции, если не удалось выделить память?)
такое дело, есть функция, которая выполняет некоторую операцию, функция при успешном выполнении...

Динамическое выделение памяти в функции
Здравствуйте, столкнулся с такой проблемой: Нужно в функции считать из файла количество строк и...

Выделение динамической памяти в функции
Прив. У меня следующая проблема: Необходимо выделить память на массив символьных строк, разбив...

Вызов функции динамического выделение памяти
Здравствуйте! Нужна помощь! Написал функцию выделение памяти под двумерный динамический...

16
181 / 47 / 33
Регистрация: 27.02.2016
Сообщений: 260
26.05.2016, 22:34 2
Строка 32, конструкция объявления динамического массива:
C++
1
int *a = new int[b];
0
Вездепух
Эксперт CЭксперт С++
11695 / 6374 / 1724
Регистрация: 18.10.2014
Сообщений: 16,068
26.05.2016, 22:50 3
Во многом те же вопросы, что и здесь

Ошибка: "переопределение формального параметра"

Причем даже с совпадением имен переменных.
0
1 / 1 / 0
Регистрация: 21.04.2016
Сообщений: 161
27.05.2016, 14:08  [ТС] 4
Теперь как очищать память т.е. удалять?

код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
 
struct stringy 
{
    char * str;
    int ct;
};
void set(stringy &, char b[]);
void show(stringy &, int);
void show(stringy &);
void show(char[], int);
void show(char[]);
int main()
{
    stringy beany;
    char testing[] = "Reality isn't what it used to be.";
    set(beany, testing);
    show(beany);
    show(beany, 2);
    testing[0] = 'D';
    testing[1] = 'u';
    show(testing);
    show(testing, 3);
    show("Done");
    std::cin.get();
    return 0;
}
 
void set(stringy & a, char b[])
{
    a.str = new char[strlen(b) + 1];
    a.str = b;
    a.ct = 2;
}
 
void show(stringy & a, int b = 1)
{
    for(int i = 0; i < b; i++)
    std::cout << a.str << std::endl;
}
 
void show(char a[], int b = 1) 
{
    for(int i = 0; i < b; i++)
    std::cout << a << std::endl;
}
void show(char a[]) 
{
    std::cout << a << std::endl;
}
void show(stringy & a)
{
    std::cout << a.str << std::endl;
}
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,669
27.05.2016, 15:41 5
C++
1
delete[] beany.str;
0
1 / 1 / 0
Регистрация: 21.04.2016
Сообщений: 161
27.05.2016, 20:19  [ТС] 6
Я пробовал. Вызвал срабатывание точки останова.

Добавлено через 43 минуты
Я пробовал. Вызвал срабатывание точки останова. Может есть другие способы?
0
0 / 0 / 0
Регистрация: 25.05.2016
Сообщений: 2
27.05.2016, 21:29 7
Есть другие способы. Создаешь класс с конструктором и деструктором. В конструкторе выделяешь память, в деструкторе уничтожаешь. А тут непойми че. Выделяется память в одном месте, уничтожается в другом. Из-за этого и ошибки.
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,669
27.05.2016, 22:51 8
Цитата Сообщение от Вадим77 Посмотреть сообщение
Я пробовал. Вызвал срабатывание точки останова.
В каком месте ты это вставил?
0
1 / 1 / 0
Регистрация: 21.04.2016
Сообщений: 161
28.05.2016, 11:48  [ТС] 9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
 
struct stringy 
{
    char * str;
    int ct;
};
void set(stringy &, char b[]);
void show(stringy &, int);
void show(stringy &);
void show(char[], int);
void show(char[]);
int main()
{
    stringy beany;
    char testing[] = "Reality isn't what it used to be.";
    set(beany, testing);
    show(beany);
    show(beany, 2);
    testing[0] = 'D';
    testing[1] = 'u';
    show(testing);
    show(testing, 3);
    show("Done");
    delete[] beany.str;
    std::cin.get();
    return 0;
}
 
void set(stringy & a, char b[])
{
    a.str = new char[strlen(b) + 1];
    a.str = b;
    a.ct = 2;
}
 
void show(stringy & a, int b = 1)
{
    for(int i = 0; i < b; i++)
    std::cout << a.str << std::endl;
}
 
void show(char a[], int b = 1) 
{
    for(int i = 0; i < b; i++)
    std::cout << a << std::endl;
}
void show(char a[]) 
{
    std::cout << a << std::endl;
}
void show(stringy & a)
{
    std::cout << a.str << std::endl;
}
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,669
28.05.2016, 14:13 10
C++
1
2
3
4
5
6
void set(stringy & a, char b[])
{
    a.str = new char[strlen(b) + 1];
    strcpy(a.str, b);
    a.ct = 2;
}
0
1 / 1 / 0
Регистрация: 21.04.2016
Сообщений: 161
28.05.2016, 15:07  [ТС] 11
Все работает. Спасибо). Но только с strcpy_s.

C++
1
strcpy_s(a.str, 50, b);
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,669
28.05.2016, 15:08 12
Надо было снять флажок с SDL, когда проект создавал.
0
1 / 1 / 0
Регистрация: 21.04.2016
Сообщений: 161
28.05.2016, 15:24  [ТС] 13
Я понял какой флажок. При создании консольного приложения. А я создавал пустой проект и файл исходного кода source.cpp, там нет никаких флажков.

вот так лучше
C++
1
strcpy_s(a.str, strlen(b) + 1, b);
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,669
28.05.2016, 16:48 14
В пустом проекте этот флажок тоже есть.
0
1 / 1 / 0
Регистрация: 21.04.2016
Сообщений: 161
28.05.2016, 17:04  [ТС] 15
При создании пустого проекта у меня нету. Использую Visual Studio 2015 community. Где этот флажок?
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,669
28.05.2016, 17:44 16
Ну в свойствах проекта отключи.
0
1 / 1 / 0
Регистрация: 21.04.2016
Сообщений: 161
28.05.2016, 18:45  [ТС] 17
Нашел. Спасибо). Теперь и strcpy работает.
0
28.05.2016, 18:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.05.2016, 18:45
Помогаю со студенческими работами здесь

Выделение памяти в процессе выполнения функции
есть массив указателей на int, объявленный глобально int* arr; но заранее я не знаю, сколько...

Выделение памяти в функции на примере калькулятора
#include &quot;stdafx.h&quot; #include &quot;std_lib_facilities.h&quot; #include &quot;windows.h&quot;...

Указатели и функции. Динамическое выделение памяти
1) Напишите программу, которая позволяет вводить динамический одно-мерный целочисленный массив и...

Выделение памяти под укзатель переданный функции
Доброго времени суток, форумчане! :) Вот коды нужных файлов: //main.cpp #include &quot;func.h&quot;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru