Процесс вернул -1073741819 (0xC0000005) в C - PullRequest
0 голосов
/ 22 апреля 2019

Я делаю программу, в которой мне нужно сначала преобразовать целое число в строку (массив символов) , для этого я использовал функцию itoa(), которая работает нормально, после чего я хочу также конкатенируйте его в строку, но он не работает и выдает следующую ошибку:

Процесс возвращен -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);
}

1 Ответ

3 голосов
/ 22 апреля 2019

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