访问冲突写入位置0x0133585B错误

时间:2019-02-04 19:37:05

标签: c runtime-error

我正在用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

3 个答案:

答案 0 :(得分:2)

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

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

char kstr[] = "hello";

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

if(pos >= strlen(str))

答案 1 :(得分:1)

  

“访问冲突写入位置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”,不能修改字符串文字

答案 2 :(得分:0)

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

if(pos > strlen(str))

应替换为

if(pos >= strlen(str))