简单的指针算法不起作用?

时间:2012-08-13 07:15:57

标签: c pointers

char * str = "Hello";

*(str+1) = '3';

cout<<str;

我试图做的是将第二个角色改为'3',将其变成H3llo

为什么不起作用?

6 个答案:

答案 0 :(得分:3)

这是未定义的行为。你无法改变文字。

要有一个指向文字的指针,它应该是:

  const char* str = "Hello";
//^^^^^

然后,为了能够改变字符串,这应该是,例如

char str[] = "Hello";

另一种选择是动态分配内存(使用mallocfree

答案 1 :(得分:2)

字符串文字在只读内存中分配。所以基本上它们是类型(const char *)。它不能被更改。 有关详细信息,另请参阅this

答案 2 :(得分:1)

因为str的类型为“const char *”,所以不允许覆盖它所指向的对象。

答案 3 :(得分:0)

#include <string.h>
char *str;
if((str = malloc(strlen("hello"))) != NULL)
  return (null);
str = strcpy(str, "hello");
printf("%s\n", str); // should print hello
str[2] = '3';
printf("%s\n", str) // should print he3lo

这里的事情是我在之前分配内存以在字符串中设置char。 但是如果你对分配不好,你可以随时设置char str [] =“hello”;

答案 4 :(得分:0)

str的内存将在.rodata部分中分配。所以试图修改只读数据会产生问题。

以下问题给出了问题。

#include <stdio.h>

int main()
{
char * str = "Hello";

printf("\n%s \n", str);
*(str+1) = '3';
printf("\n%s \n", str);


return 0;
}

相应的拆卸

 .file   "dfd.c"
        .section        .rodata
.LC0:
        .string "Hello"
.LC1:
        .string "\n%s \n"
        .text
  .....
  .....

结果是

Hello 
Segmentation fault (core dumped)

我在X86_64上使用gcc版本4.6.3(Ubuntu / Linaro 4.6.3-1ubuntu5)。

答案 5 :(得分:0)

str是指向字符串常量的指针,字符串的内存在只读部分中分配。如果您尝试修改字符串内容,则结果未定义。但是,与数组名相比,您可以将指针修改为指向其他内容,该数组名始终绑定到相同的内存位置。