EXC_BAD_ACCESS при попытке выполнить функцию strcat в C - PullRequest
2 голосов
/ 25 ноября 2010

У меня есть программа, которую я пишу для uni на C, и когда мой код достигает этой строки:

strcat("md5 ", "blah");

Я получаю ошибку EXC_BAD_ACCESS, и мое приложение вылетает. Насколько я могу судить, в этом нет ничего плохого, поэтому я подумал, что свежая пара глаз может решить мою проблему. Есть идеи?

Ответы [ 4 ]

8 голосов
/ 25 ноября 2010

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

char s[100];
strcpy(s, "md5 ");
strcat(s, "blah");
3 голосов
/ 25 ноября 2010

В C вы должны предоставить пространство для хранения чего-либо самостоятельно.«md5» имеет место только для 4 символов (+ нулевой терминатор).Там не хватает места для добавления "бла" там.

Более важно, вы не можете изменить строковый литерал.Они обычно только для чтения.Итак, вам необходимо:

  • Предоставить хранилище, в котором вы можете хранить новый объединенный результат.
  • Убедитесь, что в этой памяти достаточно места для полученной строки.

Например:

char result[9]; //the result here needs 8 characters + a nul terminator
strcpy(result,"md5 ");
strcat(result,"blah"

Или, например,

const char *a = "md5 ";
const char *b = "blah";
char *result = malloc(strlen(a) + strlen(b) + 1);
if(result == NULL) {
  out of memory
  return;
}
strcpy(result,a);
strcat(result,b);
1 голос
/ 25 ноября 2010

Согласно http://www.cplusplus.com/reference/clibrary/cstring/strcat/:

Добавляет копию исходной строки в строку назначения. Завершающий нулевой символ в месте назначения перезаписывается первым символом источника, и новый нулевой символ добавляется в конце новой строки, образованной объединением обоих в месте назначения.

Поскольку ваша первая строка является константой, вы не знаете, где она находится в памяти, и вам не разрешено играть с памятью, которая следует за ней.

1 голос
/ 25 ноября 2010

Первая строка, переданная в strcat, должна быть доступным для записи буфером с достаточным пространством для второй строки после ее текущего содержимого . Это означает, что вы не можете использовать строковые литералы в качестве первого аргумента для strcat ()!

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