在C中取消对字符串指针的引用
我是C新手,我想知道下面两个代码片段之间的区别。当我尝试执行第一个代码片段时,它工作正常,但当我运行第二个代码片段时,它会给我分段错误。这种行为的原因是什么在C中取消对字符串指针的引用,c,pointers,C,Pointers,我是C新手,我想知道下面两个代码片段之间的区别。当我尝试执行第一个代码片段时,它工作正常,但当我运行第二个代码片段时,它会给我分段错误。这种行为的原因是什么 printf("%c\n",*strptr++); printf("%c\n",*(strptr+i)); 下面是代码 #include<stdio.h> int main(void) { char str[100]="My name is Vutukuri";
printf("%c\n",*strptr++);
printf("%c\n",*(strptr+i));
下面是代码
#include<stdio.h>
int main(void)
{
char str[100]="My name is Vutukuri";
int i=0;
char *strptr;
strptr=str;
while(*strptr != '\0')
{
printf("%c\n",*strptr++);
//printf("%c\n",*(strptr+i));
//i++;
}
return 0;
}
#包括
内部主(空)
{
char str[100]=“我的名字是Vutukuri”;
int i=0;
char*strptr;
strprpr=str;
而(*strptr!='\0')
{
printf(“%c\n”,*strptr++);
//printf(“%c\n”,*(strptr+i));
//i++;
}
返回0;
}
完全不同
第一个代码段在strprtr
处打印字符,然后将strprtr
增加1
第二个代码片段在strprtr+i
处打印完全不同的字符
第一个代码段在strprtr
处打印字符,然后将strprtr
增加1
第二个代码片段在
strprprtr+i
处打印字符,也许您想用1替换i
- ++运算符首先使用初始值,然后将其递增李>
- +运算符计算新值,然后使用它
- ++运算符首先使用初始值,然后将其递增李>
- +运算符计算新值,然后使用它
- 也许你想用1代替i
strptr
指内存中已分配的位置,而strptr+i
指未分配的位置。如果将字符串分配为
char s[LENGTH];
或
然后,您只能使用从
s[0]
到s[LENGTH-1]
的字符(而且字符串本身只能是LENGTH-1
长,因此有空终止符的位置)。在您的例子中,指针strptr+i
可能不在s…s+LENGTH-1
范围内。显然,地址strptr
指内存中的已分配位置,而strptr+i
指未分配位置。如果将字符串分配为
char s[LENGTH];
或
然后,您只能使用从
s[0]
到s[LENGTH-1]
的字符(而且字符串本身只能是LENGTH-1
长,因此有空终止符的位置)。就你而言,指针strptr+i
可能不在s…s+LENGTH-1
的范围内i
的值是多少?i-roll每个人都是喜剧演员…第二行清楚地从假想的RAM读出,而第一行从真实的RAM读出。我在while循环中测试了它们的i 0到nn
的值是多少?它是否大于strprtr所指向的字符串的长度?i
?i-roll的值是多少?每个人都是喜剧演员……第二行清楚地从假想的RAM读出,而第一行从真实的RAM读出。我在while循环中测试了它们,从i 0到n,n
的值是多少?它是否大于strprtr所指向的字符串长度?当然,除非您按顺序运行这两个代码段。。。在这种情况下,i
应该为0,以复制第一行的行为。“也许您想用1替换i”——OP不太可能希望这样。OTOH,*foo++或foo[i](相当于*(foo+i))上的循环都是可互换的。这里的问题显然是i的值,但是OP出于某种无法解释的原因忽略了上下文。。。在这种情况下,i
应该为0,以复制第一行的行为。“也许您想用1替换i”——OP不太可能希望这样。OTOH,*foo++或foo[i](相当于*(foo+i))上的循环都是可互换的。这里的问题显然是i的值,但是OP出于某种莫名其妙的原因忽略了上下文。实际上它不是先在strprtr
处打印字符,然后再将其递增1,而是将其递增1,然后在旧位置打印字符trololo@Seth卡内基:为什么?我很确定这是一个后增量。增量是在调用函数之前完成的,旧值被发送到函数。我只是在和你捣乱,对你的措辞吹毛求疵。我的评论不正确,说你不知道,因为我们知道,而且行为很明确。是的,事实上你知道,我错了。参数的副作用是在调用函数之前完成的。“我很确定这是一个后增量”——我很确定你没有试图理解Seth显而易见的正确观点和你的错误。post增量只决定打印哪个字符,而不是指针何时递增。。。这取决于调用函数时出现的序列点。实际上,它不是先在strptr
处打印字符,然后再将其递增1,而是将其递增1,然后在旧位置打印字符trololo@Seth卡内基:为什么?我很确定这是一个后增量。增量是在调用函数之前完成的,旧值被发送到函数。我只是在和你捣乱,对你的措辞吹毛求疵。我的评论不正确,说你不知道,因为我们知道,而且行为很明确。是的,事实上你知道,我错了。参数的副作用是在调用函数之前完成的。“我很确定这是一个后增量”——我很确定你没有试图理解Seth显而易见的正确观点和你的错误。post增量只决定打印哪个字符,而不是指针何时递增。。。这取决于调用函数时出现的序列点。啊,一个智能且有用的响应。。。之前