Я делаю программу, в которой мне нужно сначала преобразовать целое число в строку (массив символов), для которой я использовал функцию itoa(), которая работает нормально, после этого я также хочу объединить ее в строку, но она не работает и дает мне следующее ошибка:
Process returned -1073741819 (0xC0000005)
Мой код:
int main(int argc, char *argv[]) {
char *scoreText = "Score: ";
char *msg;
int num = 1888;
itoa(num,msg,10);
printf("%s\n", msg);
printf("%s\n", scoreText);
strcat(scoreText, msg);
printf("%s\n", scoreText);
}
@Gerhardh Я конвертирую целое число в строку, используя функцию itoa(), а затем сохраняю результат в msg
Нет, вы ничего не кладете в msg. itoa пытается поместить что-то в память, где ptrуказывает на. Что не указано в вашем коде.





0xC0000005 — это в основном вариант нарушения сегментации Windows (обычно вызванный попыткой использовать память, которую вы используете не должен).
Одна из ваших проблем заключается здесь, с кодом:
char *msg;
Это создает указатель для памяти, но фактически не выделяет никакой памяти для указателя, на который указывает. Поскольку это объект с автоматической продолжительностью хранения, он будет содержать некоторое произвольное значение, которое, вероятно, будет указывать на что-то другое, чем вам нужно.
Вместо этого вы должны сделать что-то вроде:
char msg[100];
которые будут выделять 100 байтов для буфера а также, убедитесь, что идентификатор msg указывает на этот буфер.
Другая проблема:
char *scoreText = "Score: ";
strcat(scoreText, msg);
Первая строка создает указатель символа и указывает на первый символ строкового литерала "Score: ". Попытка изменить строковые литералы (например, путем добавления к ним строки) является неопределенным поведением. Чтобы решить эту проблему, у вас должна быть память, разрешенная для изменения является, например:
char scoreText[200] = "Score: ";
Это фактически дает вам 200-байтовый буфер, первоначально заполненный строкой (в отличие от указателя на строковый литерал), к которому вы можете безопасно добавить свою (до) 100-байтовую строку msg. Это фактически то же самое, что и
char scoreText[200];
strcpy(scoreText, "Score: ");
И, только один последний момент. Вы должны знать, что itoa является стандартом C нет, но то, как вы его используете, может быть легко выполнено с помощью:
sprintf(msg, "%d", num);
Окончательный рабочий код ниже, хотя, несомненно, можно было бы внести дополнительные улучшения:
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char scoreText[200] = "Score: ";
char msg[100];
int num = 1888;
sprintf(msg, "%d", num);
printf("%s\n", msg);
printf("%s\n", scoreText);
strcat(scoreText, msg);
printf("%s\n", scoreText);
}
Да, я применил ваш код, но снова получаю ту же ошибку (думаю, это из-за исправленного *scoreText).
@UsmanDeveloper, теперь это также рассматривается во второй части ответа.
ты обалденный :)
Должен согласиться, я являюсь офигенный :-) Шучу.
И вы также можете использовать один sprintf для выполнения strcat.
Куда, по-вашему, указывает указатель
msg?