Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中取消对字符串指针的引用_C_Pointers - Fatal编程技术网

在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";

我是C新手,我想知道下面两个代码片段之间的区别。当我尝试执行第一个代码片段时,它工作正常,但当我运行第二个代码片段时,它会给我分段错误。这种行为的原因是什么

        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到n
      n
      的值是多少?它是否大于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增量只决定打印哪个字符,而不是指针何时递增。。。这取决于调用函数时出现的序列点。啊,一个智能且有用的响应。。。之前