Создание одного массива строк в C не удается, почему? - PullRequest
0 голосов
/ 30 декабря 2011

Я пытался создать один массив строк в C. Вот код:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

int main()
{
    char *foo[100];
    strcpy(foo[0], "Testing this");
    printf("%s ", foo[0]);

    return 1;
}

Но когда я его скомпилирую, он просто ломается.Нет ошибок, нет ничего, это просто не работает и ломается.Любое предложение?Когда я запускаю tri char * foo [10], это работает, но я не могу работать только с 10 строками

Ответы [ 5 ]

4 голосов
/ 30 декабря 2011

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

char *foo[100];
foo[0] = malloc(13);
strcpy(foo[0], "Testing this");

Естественно, вам понадобится free память на более поздний срок, когда вы закончите с ней.

Ваш код вызывает так называемое неопределенное поведение .В принципе может произойти все что угодно, включая код, работающий так, как вы задумали.Если версия с char *foo[10] работает так, как вы рассчитывали, это просто неудача.

Кстати, ваше определение main() неверно.Это должно быть int main(void).

1 голос
/ 30 декабря 2011

Вы создаете 100 указателей, чтобы указать, где нет. Как объяснил Дэвид, вам нужно динамически распределять память. Однако вы также можете сделать так, чтобы компилятор сделал это за вас, если вы знаете размер строк (или максимум):

// Create an array of 10 strings of size 100 and initialize them automatically
char foo[10][100] = {0};

// Now you can use it them and not worry about memory leaks
strcpy(foo[0], "text");

// Or use the safer version
strcpy_s(foo[0], 100, "text");
1 голос
/ 30 декабря 2011

Вы назначаете нераспределенный указатель. char * foo [100] - это массив из 100 нераспределенных указателей, которые указывают на неизвестные места в памяти, к которым вы, вероятно, не можете получить доступ.

0 голосов
/ 02 июня 2017
#include <stdlib.h>
#include <stdio.h>

int main(void){
    char *foo[100];
    foo[0] = malloc(13*(sizeof(char)));
    strcpy(foo[0], "Testing this");
    printf("%s ", foo[0]);

    return 0;
}

Это исправленная версия вашего кода.

MISTAKE: not allocating enough memory for the string.

CORRECTION: using malloc to allocate 13 blocks of memory for the string.
0 голосов
/ 30 декабря 2011

Расширение на ответы других людей:

char *foo;

- указатель на символ.Ему может быть назначен адрес одного символа или назначен адрес первого из последовательности символов, оканчивающихся на «\ 0».Ему также может быть назначен адрес через malloc ().

char foo[100];

- это пробел для 100 символов или пробел для строки длиной до 99 символов и завершающего символа '\ 0'.

char *foo[100];

- это 100 символьных указателей, т. Е. 100 char *foo; типов.

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