2012-11-07 95 views
0

可能重复:
Why do I get a segmentation fault when writing to a string?分配值指针抛出异常

我是新来的C/C++,我想了解它,我已经创建了下面的功能,但它会抛出一个异常,当我试图将大写值赋给*字符串时:CPP1.exe中的0x00411820处未处理的异常: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); 

你能帮帮我吗?

+10

让我猜猜,你传递一个字符串。向我们展示'main'功能。 – avakar

+0

请显示此功能的用法 – giorashc

+0

是的,我正在尝试以下事情:char * x =“text”; ToUpper的(X); – Eugene

回答

3

变化

char* x = "text"; 

char x[] = "text"; 

DONE

+0

太棒了,它可以工作,但是请你解释为什么x []工作和char * []没有,或者指向我可以找到它的某些资源? – Eugene

+1

阅读此链接:http://msdn.microsoft.com/en-us/library/69ze775t(v=vs.80).aspx – billz

+0

字符串文字位于只读位置,无法修改... – billz

2

从不尝试更改常量字符串。总是使用字符数组进行这种操作。

+0

它相当“从来没有_try_改变......“;) – SingerOfTheFall

+0

或'malloc','calloc'。如果它是C++更好,'std :: string' –

-1

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

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

+0

没有解决问题 – Eugene

+0

它没有解决任何问题,但它增加了另一个主要错误,导致程序崩溃更加困难。 – Lundin

0

您可以使用这样无需创建symbol varible

*string=*string-32; 

但通过array在调用环境中的功能,而通过​​

所以

“文本”
char * str[] ="hello"; 
ToUpper(str); 
1

内存将在.readonly部分进行分配。

char* x = "text"; 

Tyring以改变只读部分是未定义的行为。使用gcc -S filename.c来查看汇编代码。这给你更多关于“文本”的去向的想法。

与其他人一样,我建议使用char x[] = "text"代替。

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";的情况下,只能将指针放在堆栈上,但内容指向受限制(只读)的内存。

+0

由于字符串长度在编译时已知,使用malloc绝对没有意义。如果你这样做,请致电免费()。 – Lundin

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 
}