以下代码在第二行给出了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
为什么不能在一次操作中完成?
答案 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";
您正试图在这里创建一个直接指向字符串的指针。这将导致意外行为(因为它是一个只读空间)
相反,我建议您使用字符数组。