strcpy при наличии указателей на символы в C - PullRequest
2 голосов
/ 11 октября 2011

У меня есть простое сомнение в массивах символов.У меня есть структура:

struct abc {
char *charptr;
int a;
}

void func1()
{
    func2("hello");
}

void func (char *name)
{
    strcpy(abc.charptr, name); >>> This is wrong. 
}

Это strcpy приведет к падению, так как у меня нет памяти, выделенной для charptr.Вопрос заключается в следующем: можем ли мы сделать неправильное использование этой памяти

abc.charptr = (char *) malloc(strlen(name)); ?
strcpy(abc,charptr, name); >>> Is this (or strncpy) right ?

Это правильно?

Ответы [ 3 ]

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

Это должно быть:

abc.charptr = malloc(strlen(name)+1); ?
strcpy(abc.charptr, name);

Возвращаемое значение strlen не включает пробел для нулевого нуля '\ 0' в конце строки.

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

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

Если вы должны использовать malloc(), вам нужно помнить, чтобы освободить место для нулевого терминатора.Поэтому используйте malloc(strlen(name)+1) перед вызовом strcpy().

Но в этом случае вы должны просто использовать strdup(), который выполняет выделение и копирование за один раз:

abc.charptr = strdup(name);

Возвращенная памятьstrdup() было присвоено malloc() и, следовательно, должно быть утилизировано с помощью вызова free().

1 голос
/ 11 октября 2011
abc.charptr = (char *) malloc(strlen(name) + 1);

Обратите внимание на +1, так как вам нужно место для нулевого терминатора. Тогда strcpy () будет в порядке.

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