Вы не выделяете то, что, по вашему мнению, выделяете.
Когда ты сказал
char **str;
это не переменная, которая может содержать одну строку. Это переменная, которая может содержать массив из нескольких строк.
Когда ты сказал
int len = 1;
str = malloc(sizeof(char*) * len);
вы настраиваете str
для хранения одной строки. То есть в данном случае len
подсчитывает количество строк, а не длину строки.
Тогда, когда вы говорите
str[0] = "This is a string";
вы заполняете одну строку str
указателем на строковую константу. Компилятор выделил для вас память для строковой константы, так что вам это не нужно. В этом случае все, что вы делаете, это копируете указатель. Вы не копируете всю строку, поэтому вам не нужно выделять для нее больше памяти. Это похоже на то, если бы вы только что сказали
char *p;
p = "This is a string";
Если вы хотите выделить память для всей строки и фактически скопировать всю строку, это может выглядеть так:
const char *string_to_copy = "This is a string";
str[0] = malloc(strlen(string_to_copy) + 1); /* +1 for \0 */
if(str[0] == NULL) exit(1);
strcpy(str[0], string_to_copy);
И если вы хотите использовать str
для хранения нескольких строк, это может выглядеть так:
len = 4;
str = malloc(sizeof(char*) * len);
if(str == NULL) exit(1);
str[0] = "This";
str[1] = "is";
str[2] = "a";
str[3] = "test.";
person
Steve Summit
schedule
08.07.2016
malloc()
выделит только один байт? - person babon   schedule 08.07.2016str[0] = "This is a string";
не делает физическую копию. Для копирования используйте функциюstrcpy(...)
. - person Beka   schedule 08.07.2016