【问题标题】:How do I fix Access violation writing exception如何修复访问冲突写入异常
【发布时间】:2015-06-19 22:06:06
【问题描述】:

我有以下代码

#include <stdio.h>
#include<conio.h>
#include <ctype.h>
char *convertire(char *sir)
{
    char *sir2="";
    while (*sir)
    {
        *sir2 = toupper(*sir);
        sir++;
    }
    return (sir2);
}
void main(void)
{
    char *sir = "Home is good";
    char *sir2 = convertire(sir);
    printf("Sirul obtinut este : %s\n", sir2);
    _getch();
}

当我尝试编译时,出现以下错误

First-chance exception at 0x00E3141B in pointeri.exe: 0xC0000005: Access violation writing location 0x00E35858. If there is a handler for this exception, the program may be safely continued.

你能帮我解决这个问题吗?

【问题讨论】:

  • 你的问题是什么?
  • 不清楚你在问什么,请尽可能详细地写下你的问题。
  • 当我尝试构建此代码时,编译器向我显示:pointeri.exe 中 0x00E3141B 的第一次机会异常:0xC0000005:访问冲突写入位置 0x00E35858。如果有这个异常的处理程序,程序可以安全地继续。所以我不能编译这段代码。有什么问题?谢谢

标签: c pointers access-violation first-chance-exception


【解决方案1】:
char *sir2="";

没有为您的指针 sir2 分配足够的内存,并且也只是只读的。

你需要类似的东西

char *sir2 = malloc(strlen(sir1) + 1);

访问未分配的内存会导致未定义的行为并可能导致崩溃。除了为指针分配内存之外,这无法以任何其他方式处理。

【讨论】:

  • 真的是没有记忆吗?
  • 执行此操作后,程序也不会按预期运行。我相信OP希望将sir的每个字母大写并将其存储在sir2中,然后打印sir2
  • @Jongware 是的,你是对的。我现在更正了我的措辞
【解决方案2】:

您还需要跟踪sir2 的开始,基本上您需要像这样修改convertire()

char *convertire(char *sir)
{   
    char *p;
    char *sir2=(char *)malloc(strlen(sir)+1);
    p = sir2;
    while (*sir)
      {   
        *sir2++ = toupper(*sir++);
      }
    return p;
}

【讨论】:

  • 不要将malloc的结果转换成C。
  • 平心而论,虽然这是一个很好的观察,但这不是 OP 所要求的:P 也许你让他错过了一个重要的教训:让程序编译确实不会自动等于让它做他想做的事。
  • @Jongware,在我看来,OP 想要将“Home is good”转换为大写,类似于“HOME IS GOOD”,这会在发布的 convertire() 中发生更多。所以到这里两个目的都实现了,程序编译出来,提供了想要的结果。
  • @CoolGuy 你会惊讶地发现它的使用频率。
猜你喜欢
  • 1970-01-01
  • 2018-07-25
  • 1970-01-01
  • 2021-07-12
  • 2021-06-04
  • 2020-06-15
  • 2016-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多