增加char指针

时间:2016-03-15 20:28:35

标签: c char increment

以下代码在第二行给出了seg错误:

 char *tester = "hello";
 char a = (*tester)++;  // breaks here
 printf("Char is %c\n", a);

以下代码有效:

 char *tester = "hello";
 a = *tester;
 a++;
 printf("Char is %c\n", a);

 // prints i

为什么不能在一次操作中完成?

7 个答案:

答案 0 :(得分:8)

可能是,你只是在增加错误的东西。 (*tester)++增加tester指向的数据。我相信你想做的是*(++tester),它会增加指针然后取消引用它。

答案 1 :(得分:4)

char *tester = "hello";

这里测试人员指向一个字符串常量。它存储在只读存储器中。任何写入修改都会导致未定义的行为。

正如@Taelsin所指出的,似乎你想要增加指针本身,而不是指向它。你需要*(++ tester)。

OP澄清后:

如果你想把H增加到I,那么(* tester + 1)就可以完成这项工作。

答案 2 :(得分:2)

如果要增加字符,可以向其添加1而不是使用增量运算符:

char *tester = "hello";
char a = (*tester) + 1; // instead of (*tester)++
printf("Char is %c\n", a);

希望这就是你要找的东西。

<强>解释

在另一个答案中,zenith评论了为什么不能使用增量运算符的解释:

字符串文字,如&#34;你好&#34;在只读存储器中初始化。无法增加其值。这就是为什么你必须先复制值,如果你想改变它。 char a = (*tester) + 1;获取第一个字符的值,将其加1并将其保存到a

答案 3 :(得分:2)

char a = (*tester)++;不会像你想象的那样增加指针;它会增加取消引用的指针,即指针指向的值。

您实际上是在尝试对字符串文字进行更改,字符串文字可能驻留在只读内存中,从而导致未定义的行为。

参见n1570,6.4.5字符串文字:

  

7未指明这些阵列是否与它们不同   元素具有适当的值。如果程序试图   修改这样的数组,行为是未定义的。

要增加指针,请使用char a = *(tester++);char a = *tester++;,这要归功于运算符优先级。

答案 4 :(得分:0)

我想你正试图做这样的事情......

const char *tmp = "Hello world. This is a great test";
   int count = strlen(tmp);
   while(count>0)
   {
      printf("%s\n",tmp);
      tmp++;
      count--;
   }

答案 5 :(得分:0)

我认为没有一个答案能完全回答op的问题:op想将'h'解除对'i'的引用,他还想知道segmentFault来自他的第一个代码段的原因

结合以上答案/评论,我在此处列出完整答案:

A。 op的第一个困惑来自char s[]char *s之间的概念差异:

char *s="hello";是将字符串常量“ hello”放置在只读存储器中,并将s用作指向该字符串常量的指针,从而使任何写入操作均无效。而如果定义:

char s[]="hello";是将字符串文字放入只读存储器中,并将该字符串复制到堆栈上的另一个已分配内存中,以便您可以读取/直接在堆栈内存上写(仍然不会碰到只读内存)。

因此,对char *test的取消引用将为您提供一个常量char,这是位于只读存储器上的字符串文字的第一个字母,这就是尝试char a = (*tester)++将会失败的原因,因为这是只读存储器上的指针操作,其行为是不确定的。

B。为什么第二个代码段有效?

写入a = *tester;意味着您声明另一个变量char a,然后在堆栈存储器上为char分配一些空间并将其值初始化为'h'; 这等效于以下内容:

char a;
a = 'h';

您当然可以增加a

以下是显式打印地址的示例:run link

#include <stdio.h>

int main()
{
    char * tester = "hello";
    printf("tester first  letter address=%p\n",  tester);       // print out address should be something like 0x400648
    printf("tester second letter address=%p\n", (tester+1));    // print out address should be something like 0x400649

    char a;
    a = *tester;
    printf("a address=%p\n", &a);                               // print out address should be something like 0x7ffe0bc6aab7
    a++;        
    printf("a address=%p\n", &a);                               // print out address should be something like 0x7ffe0bc6aab7

    return 0;
}

答案 6 :(得分:0)

 char *tester = "hello";

您正试图在这里创建一个直接指向字符串的指针。这将导致意外行为(因为它是一个只读空间)

相反,我建议您使用字符数组