在C:未处理的异常:0xC0000005:访问冲突写入位置。程序将无法运行

时间:2016-02-07 09:35:23

标签: c pointers visual-studio-2013

Visual Studio告诉我,我的代码问题在

*p = *p1;

但我不明白那里有什么不对 此代码中的目标是构建一个函数,该函数将获取字符串和int,并将对字符串进行排序并返回int的索引中的字母。
例如,对于字符串“build”,如果int为2将返回“i”,则将其排序为“bdilu”。 这是我写的代码:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
char letterAtIndex(char *s, int n);

void main(){
    char s, *arr = { "a string" };
    s=letterAtIndex(arr, 7);
    printf("%c", s);
    getch();
}
char letterAtIndex(char *s, int n){
    int t;
    char *p1 = s, *p2 = s, *p;
    while (*(++p2));
    while (p1 < p2){
        p = p1;
        while (p < p2){
            if (*p1>*p){
                t = *p;
                *p = *p1;
                *p1 = t;
            }
            p++;
        }
        p1++;
    }
    return s[n];
}

这就是错误:

Unhandled exception at 0x00F81436 in justforstudy.exe: 0xC0000005: 
Access violation writing location 0x00F85859.

2 个答案:

答案 0 :(得分:3)

您将字符串文字传递给函数letterAtIndex。你不能写信给它。将char *arr = { "a string" };更改为char arr[] = { "a string" };即可。char arr[]是一个类型为char且可读写的元素数组:

int main(){
    char arr[] = { "a string" };
    char s = letterAtIndex( arr, 7 );
    printf( "%c", s );
    return 0;
}

另一种可能性是分配动态内存并将字符串复制到其中。

#include <string.h> // strcpy
#include <malloc.h> // malloc, free

int main(){
    const char *str = "a string";
    char *arr = malloc( strlen(str ) + 1 );
    strcpy( arr, str );
    char s = letterAtIndex( arr, 7 );
    printf( "%c", s );
    free( arr );
    return 0;
}

答案 1 :(得分:2)

尝试更改字符串文字是未定义的行为。对于指向字符串文字的变量,请使用类型const char *,以便编译器在您尝试执行此操作时帮助您发现。

您可以通过以下方式修复代码:

  • 制作传入的字符串的副本并对其进行排序并将其返回(之后您需要将其释放)。
  • 传入可变缓冲区,例如将arr声明为char arr[]