为指针赋值会引发异常

时间:2012-11-07 08:57:42

标签: c++ c

  

可能重复:
  Why do I get a segmentation fault when writing to a string?

我是C / C ++的新手,我正在尝试学习它,我创建了以下函数,但是当我尝试将大写值分配给* string时,它会引发异常:0x00411820处的未处理异常CPP1.exe:0xC0000005:访问冲突写入位置0x00417754。

void ToUpper(char* string)
{
    while(*string != '\0')
    {
        if(*string >= 97 && *string <= 122)
        {
            int symbol = *string;
            *string = symbol - 32;
        }
        string++;
    }
}

用法:

char* x = "text"; 
ToUpper(x); 

你能帮我吗?

7 个答案:

答案 0 :(得分:3)

变化

char* x = "text"; 

char x[] = "text"; 

DONE

答案 1 :(得分:2)

从不尝试更改const字符串。始终使用字符数组进行此类操作。

答案 2 :(得分:1)

“text”的内存将在.readonly部分中分配。

char* x = "text"; 

改变只读部分的Tyring是未定义的行为。

使用gcc -S filename.c查看汇编代码。这让您更加了解“文本”的位置。

与其他人一样,我建议改为使用char x[] = "text"

答案 3 :(得分:1)

main()
{
    char *a = "text";
    char *x = malloc(strlen(a)+1); 
    strcpy(x,a);
    ToUpper(x);
    // ToUpper(a); // Fails
    printf("%s %s\n",a,x);
}

输出:text TEXT

ToUpper(a)失败,因为字符串被替换在受保护的内存区域(代码中间最可能,因为至少64位x86处理器具有[rip] - 相对寻址模式,这使得它利润丰厚,可以在代码行之间放置数据......

同样char x[]="text";有效,因为现在x的完整数组被放置在堆栈中。在char *x = "text";的情况下,只有指针放在堆栈上,但内容指向受限(只读)内存。

答案 4 :(得分:1)

尝试通过指针修改字符串文字是错误的:

void f()
{
   char * p = "Naee";
   p[2] = 'm'; // error: assignment to const; result is undefined
}

使字符串文字保持不变可以在存储分配和访问中进行重要的优化。如果您想要一个可以修改的字符串 修改,你必须将字符复制到数组中:

void f()
{
   char p [] = "Eero"; 
   p [0] = 'Z'; // ok
}

答案 5 :(得分:0)

您可以像这样使用,无需创建symbol变量

*string=*string-32;

但是将array传递给调用环境中的函数而不是传递string literal

所以

char * str[] ="hello";
ToUpper(str);

答案 6 :(得分:-1)

您必须在赋值语句中键入强制转换值。

* string = *(char *)symbol - 32;