Доступ к char * после присвоения его значения C - PullRequest
2 голосов
/ 31 мая 2010

Я назначил значение переменной-члена, как показано ниже:

myValue = (char*)malloc(strlen(inValue) * sizeof(char));

strcpy(mValue, inValue);

при присвоении этого значения было правильно (принимая вывод printf):

http://www.w3.org/2001/XMLSchema

Но когда я получаю его значение после подопечных, я получаю его как:

http://www.w3.org/2001/XMLSchema(!

В чем может быть проблема для этой проблемы

Ответы [ 3 ]

15 голосов
/ 31 мая 2010

strlen () возвращает до, но не включая завершающий NUL, поэтому вам нужно добавить 1 к его возвращению в вашем malloc (). Таким образом, myValue остается неопределенным.

myValue = malloc((strlen(inValue) + 1) * sizeof(char));
2 голосов
/ 31 мая 2010

Функция strcpy (myValue, inValue) копирует содержимое строки inValue, к которой добавляется символ завершения строки с завершающим символом '\ 0', в блок памяти, выделенный функцией malloc.

Как только strlen (inValue) возвращает длину строки, исключая контрольный символ '\ 0', область, выделяемая функцией malloc (strlen (inValue) * sizeof (char)), становится недостаточно большой для получения strcpy (myValue, inValue).

Таким образом, символ '\ 0' копируется в недопустимую область памяти, перезаписывая данные другой программы, и может вызвать ошибку сегмента, BAD ACCESS, GPF или что-то еще, например, отсутствие сообщения об ошибке и отображение непредсказуемых результатов, в зависимости от на компиляторе / операционной системе / платформе.

В вашем случае вы получили правильный результат сразу после выполнения strcpy, но чуть позже строка, казалось, была повреждена, потому что '\ 0' было скопировано в область памяти, которая не принадлежит блок выделен для myValue, и владелец этого блока может просто изменить его, и ваша строка потеряет свой конечный суффикс. Таким образом, при попытке снова напечатать myValue после этого может появиться программная ошибка или просто мусор.

Чтобы исправить ваш код, необходимо увеличить площадь, как показано на рисунке ниже.

Еще одна вещь ... в вашем примере вы написали strcpy (mValue, inValue) вместо strcpy (myValue, inValue), но я думаю, что вы написали опечатку при написании поста.

myValue = (char*)malloc((strlen(inValue) + 1) * sizeof(char));

strcpy(myValue, inValue);
1 голос
/ 31 мая 2010

Вы не должны приводить тип возврата из вызова malloc. И всегда включайте stdlib.h.

myValue = malloc((strlen(inValue) + 1) * sizeof(char));

Надеюсь, это поможет,

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