【问题标题】:Access violation writing location 0x0133585B Error访问冲突写入位置 0x0133585B 错误
【发布时间】:2019-02-04 19:37:05
【问题描述】:

我正在用 C 编写一个程序,下面的函数接受三个参数,并将字符串中的一个字符替换为另一个字符。好吧,大部分都可以正常工作,但是在尝试执行这部分代码时出现错误:str [pos] = ch;。错误提示“访问冲突写入位置 0x0133585B。”

void kstrput(char *str, size_t pos, char ch)
{
    if(pos > strlen(str))
    {
        abort();
    }
    str[pos] = ch;
}

主要部分:

char *kstr = "hello";
    int pos = 3;
    char s = '\0';
    printf("\n Enter a character ");
    scanf("%c", &s);
    kstrput(kstr,pos,s); // calling the kstrput function
    printf("\n After kstrput: %s",kstr); //printing the struct to check value of the string

【问题讨论】:

  • 显示调用函数的代码。您可能正在传递一个不可写的字符串文字。
  • 如果 pos == strlen(str) 覆盖 null 终止符,str 不再是有效字符串。来自后续 print 的未定义行为如下。
  • 以这种方式使用 strlen 几乎总是错误的:函数的调用者必须给出字符串的长度,因为在函数内部“猜测”它是非常危险的。

标签: c runtime-error


【解决方案1】:

"hello" 是常量(不可修改)并且可能(并且可能是)存储在只读存储器中。

指向它的正确方法是使用const char * 类型的指针。 您需要做的是定义char 的数组并将其初始化为“hello”:

char kstr[] = "hello";

还要注意,在kstrput 中,如果pos 等于strlen(str),那么它将覆盖指示字符串结尾的'\0'。 更好的使用:

if(pos >= strlen(str))

【讨论】:

    【解决方案2】:

    “访问冲突写入位置0x0133585B。”

    你会的

    {
      int pos = 3;
      ...
      char *kstr = "hello";
      ...
      kstrput(kstr,pos,s); // calling the kstrput function
    }
    
    void kstrput(char *str, size_t pos, char ch)
    {
       str[pos] = ch;
       ...
    }
    

    str[pos] = ch; pos 值 3 是一个有效的索引,但 str 是字符串文字“hello”,字符串文字不能修改

    【讨论】:

      【解决方案3】:

      函数 void kstrput(char *str, size_t pos, char ch) 中的这一行

      if(pos > strlen(str))
      

      应该替换为

      if(pos >= strlen(str))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-20
        • 2015-08-15
        • 2020-09-04
        • 2012-12-05
        相关资源
        最近更新 更多