繁体   English   中英

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

[英]Simple pointer arithmetic not working?

char * str = "Hello";

*(str+1) = '3';

cout<<str;

我在那里尝试做的是将第二个字符更改为“ 3”,将其转换为H3llo

为什么不起作用?

这是未定义的行为。 您不能更改文字。

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

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

然后,为了能够更改字符串,例如

char str[] = "Hello";

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

字符串文字是在只读存储器中分配的,因此基本上它们是类型( const char * ),不能更改。 另请参阅以获取更多信息。

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

#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”;

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)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM