递增地址

时间:2014-02-28 20:53:08

标签: c

我有一个指向字符的变量字。然而,每当我尝试增加& c时,我都会得到c:

的奇怪值
char *word = "testing";
char c = *word; // 't'
c = *(&c + 1); // want to be 'e'

我做错了吗?

3 个答案:

答案 0 :(得分:4)

该行

char c = *word; // 't'

在堆栈的内存中为新char(c)分配空间。然后它将此char设置为't',因为这是*word处的内容。 c(&c)的地址不会与word相同。

要做你想做的事情:

char c;                 //allocate space for a char
char *word = "testing";
c = *word;              // c == 't'
c = *(word + 1);        // c == 'e'

答案 1 :(得分:2)

c的地址位于堆栈的某个位置。它与word指向的地址不同。你想这样做:

char *word = "testing";
char *c = word; //same as &word[0]
*c; //'t'
c += 1;
*c; //'e'

答案 2 :(得分:1)

c是一个char个对象,其值为't'

&c + 1是一个有效的地址,指向c在内存中的位置,但那里没有任何对象。 (它的有效只是因为一个特殊情况规则允许指针指向数组的末尾,其中单个对象被视为1元素数组。)取消引用该地址会导致未定义的行为;实际上,它可能会在内存中c之后获取正好存储的垃圾。

通过将c初始化为*word,您没有将c指向字符串的第一个字符,而是使其包含副本字符串的第一个字符。