进程在C

时间:2019-04-22 07:55:31

标签: c arrays pointers malloc strcat

我正在编写一个程序,在该程序中,我需要先将一个整数转换为字符串(char数组),因为我使用的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 个答案:

答案 0 :(得分:3)

0xC0000005基本上是Windows的分段冲突变体(通常是由于尝试使用您不应该使用的内存引起的)。

您的问题之一在此处,代码如下:

char *msg;

这会为内存创建一个 pointer ,但实际上并没有为指针指向分配任何内存。由于它是具有自动存储持续时间的对象,因此它将包含一些任意值,该值可能指向了您不需要的其他地方。

您应该执行的操作类似于:

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