0

可能重复:
为什么在写入字符串时会出现分段错误?

我是 C/C++ 的新手,我正在尝试学习它,我创建了以下函数,但是当我尝试将大写值分配给 *string 时,它会引发异常: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); 

请你帮助我好吗?

4

7 回答 7

3

改变

char* x = "text"; 

char x[] = "text"; 

完毕

于 2012-11-07T09:02:10.667 回答
2

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

于 2012-11-07T09:00:19.243 回答
1

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

char* x = "text"; 

试图更改只读部分是未定义的行为。

用于gcc -S filename.c查看汇编代码。这使您对“文本”的下落有更多了解。

像其他人建议的那样,我建议char x[] = "text"改用。

于 2012-11-07T09:07:19.990 回答
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";只有指针放在堆栈上,但内容指向受限(只读)内存。

于 2012-11-07T09:08:29.007 回答
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
}
于 2012-11-07T09:22:17.593 回答
0

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

*string=*string-32;

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

所以

char * str[] ="hello";
ToUpper(str);
于 2012-11-07T09:05:01.230 回答
-1

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

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

于 2012-11-07T09:01:09.233 回答