可能重复:
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);
你能帮我吗?
答案 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;