【问题标题】:Process returned -1073741819 (0xC0000005) in C进程在 C 中返回 -1073741819 (0xC0000005)
【发布时间】:2023-03-15 21:06:01
【问题描述】:

我正在制作一个程序,其中我需要首先将整数转换为字符串 (char array) 因为我使用了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);
}

【问题讨论】:

  • 你希望指针msg指向哪里?
  • @Gerhardh 我正在使用itoa() 函数将整数转换为字符串,然后将结果保存到msg
  • 不,您没有在msg 中添加任何内容。 itoa 尝试将某些内容放入内存中 ptr 指向的位置。您的代码中未指定哪个。

标签: c arrays pointers malloc strcat


【解决方案1】:

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,现在答案的第二部分也涵盖了这一点。
  • 你太棒了:)
  • 我必须同意,我 am 太棒了 :-) 开个玩笑。
  • 你也可以使用sprintf来做strcat。
猜你喜欢
  • 2019-06-20
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
相关资源
最近更新 更多