进程在 C 中返回 -1073741819 (0xC0000005)
Process returned -1073741819 (0xC0000005) in C
我正在制作一个程序,我需要首先将整数转换为字符串 (char array) 为此我使用了 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);
}
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);
}
我正在制作一个程序,我需要首先将整数转换为字符串 (char array) 为此我使用了 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);
}
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);
}