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);
}