динамическое размещение (массивы) со строкой или символом - PullRequest
0 голосов
/ 11 октября 2011

здесь нет проблем:

int *x;
x = (int *) malloc(0 * sizeof(int));
int value = 5;
x = (int *) realloc(x,(value)*sizeof(int));

Но я не могу сделать это для строк: \

Я хочу сделать это для массива y [], вот так:

y[0]="hello"
y[1]="how are you"

как я могу это сделать?

Ответы [ 4 ]

10 голосов
/ 11 октября 2011
std::vector<std::string> y;
y.push_back("hello");
y.push_back("how are you");

Не используйте malloc, или realloc, или free в C ++. Не используйте char* для других целей, кроме взаимодействия. Держитесь подальше от указателей, пока они вам действительно не понадобятся (то же самое для массивов).

2 голосов
/ 11 октября 2011

Вы не можете использовать realloc для массива std::string объектов, потому что realloc перемещает объекты с помощью битового копирования, и это не разрешено для общих объектов.

Стандартный класс std::vector являетсяуниверсальный контейнер для объектов, который правильно перемещает и копирует объекты (используя конструкторы копирования, назначения и аналогичные методы) и может изменять его размер, например, с помощью метода resize.Вся необходимая память распределяется и освобождается автоматически по мере необходимости.

Например, std::vector вы можете написать код, например ...

std::vector<std::string> v;  // An empty vector
v.resize(10);                // Now size is 10 elements (all empty strings "")
v[0] = "Hello";              // First element is now the string "Hello"
v[1] = "world.";             // Second element is now the string "world."
v.resize(2);                 // Now v.size() is 2
v.push_back("How's going");  // Now the size is 3 and third element is filled.

Сделайте себе одолжение и возьмите хорошая книга по С ++ , читая ее от корки до корки.C ++ - мощный, но сложный язык, и если вы попытаетесь выучить его, экспериментируя с компилятором, вы совершите ужасную ошибку по многим причинам.

1 голос
/ 11 октября 2011

То, что вы делаете сейчас, это не C ++ ... вы можете делать то, что вы хотите, со строками в стиле C, но вам понадобится массив указателей для ввода char, который позволит вам получить доступ к выделенной памяти для каждая строка в массиве. Это можно сделать так:

char* y[2];
y[0] = strdup("hello");
y[1] = strdup("how are you");

Вам также нужно помнить, что ваш массив y теперь "владеет" указателями, поэтому вы должны вызывать free() для каждого указателя в массиве, чтобы избежать утечек памяти, если вы решите изменить строки каждый указатель указывает на.

Если вы хотите использовать идиоматическое решение C ++, но не возвращаться к строкам в стиле C, тогда вам следует использовать std::string и std::vector ..., чтобы избежать проблем с утечками памяти, а также выделение и освобождение памяти, связанной с динамически распределенными C-строками.

0 голосов
/ 12 октября 2011

На самом деле вы можете делать в точности то, что вам нужно, с целыми числами:

typedef const char *c_string;
c_string *y;
y = (c_string *) malloc(0 * sizeof(c_string));
int value = 5;
y = (c_string *) realloc(y,(value)*sizeof(c_string));
y[0]="hello";
y[1]="how are you";

Это не будет работать с неконстантными char *, так что этот пример имеет ограниченное использование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...