进程在 C 中返回 -1073741819 (0xC0000005)



我正在制作一个程序,我需要首先将整数转换为字符串(char 数组),为此我使用了itoa()函数,该函数工作正常,之后我也想将其转换为字符串,但它不起作用并给我以下错误:

进程返回 -1073741819 (0xC0000005)

我的代码:

int main(int argc, char *argv[]) {
char *scoreText = "Score: ";
char *msg;
int num = 1888;
itoa(num,msg,10);
printf("%sn", msg);
printf("%sn", scoreText);
strcat(scoreText, msg);
printf("%sn", 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("%sn", msg);
printf("%sn", scoreText);
strcat(scoreText, msg);
printf("%sn", scoreText);
}

相关内容

  • 没有找到相关文章

最新更新