2d массив, используя calloc в C - PullRequest
0 голосов
/ 19 апреля 2010

Я пытаюсь создать двумерный массив символов для строк хранения символов. Например:

lines[0]="Hello";
lines[1]="Your Back";
lines[2]="Bye";

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

int i;
char **lines= (char**) calloc(size, sizeof(char*));

for ( i = 0; i < size; i++ ){
lines[i] = (char*) calloc(200, sizeof(char));
}

for ( i = 0; i < size; i++ ){
free(lines[i]);
}

free(lines);

Я знаю, что каждая строка не может превышать 200 символов. Я продолжаю получать ошибки, такие как «ошибка C2059: синтаксическая ошибка:« для »и тому подобное. Есть идеи, что я сделал не так?

Ответы [ 4 ]

4 голосов
/ 19 апреля 2010

Нет, код отсутствует в функции.

Вы не можете просто поместить произвольные операторы вне функций в C и C ++. Однако вы можете использовать функцию для инициализации переменной:

char** init_lines() {
    char** ln = /* ... */;
    // your allocations etc. here
    return ln;
}

char** lines = init_lines();
1 голос
/ 19 апреля 2010

Для начала, это первая трата времени calloc, так как вы сразу же инициализируете их первым циклом for.

Сказав это, нет ничего плохого в показанном вами коде.

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


Ошибки:

syntax error : 'for' syntax error : missing ')' before ';'
syntax error : missing ';' before '<' missing type specifier - int assumed

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

1 голос
/ 19 апреля 2010

Вы пометили вопрос с помощью C ++ - почему бы не использовать std::vector<std::vector<char> > для этого?

Глядя на ошибку компилятора, похоже, что вы пропустили точку с запятой перед одним из циклов forкод, который вы разместили, кажется, отлично работает здесь.

0 голосов
/ 26 декабря 2013

Здесь у меня другое мнение. Может быть полезно char указатель или char double неявно определяются во время компиляции. Следовательно, нет необходимости определять явно, и при этом он показывает синтаксическую ошибку. Попробуйте указатель char без инициализации с помощью calloc, и если вы не хотите, чтобы значение мусора инициализировалось с помощью NULL. Это похоже на использование calloc, вы не найдете ничего другого.

...