Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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 为什么我的左移位函数会给出seg故障,除非我使用if语句终止?_C - Fatal编程技术网

C 为什么我的左移位函数会给出seg故障,除非我使用if语句终止?

C 为什么我的左移位函数会给出seg故障,除非我使用if语句终止?,c,C,我正在使用一段代码将字符串中的所有字符向左移动一个位置。代码如下: char* leftshift(unsigned char *fmla){ int i; for (i = 0; i != strlen(fmla); i++) { /* if (i == strlen(fmla)-1){ fmla[i] = 0; return fmla; } */ *(fmla + i) = *(fm

我正在使用一段代码将字符串中的所有字符向左移动一个位置。代码如下:

char* leftshift(unsigned char *fmla){
     int i;
     for (i = 0; i != strlen(fmla); i++) {
         /* if (i == strlen(fmla)-1){
         fmla[i] = 0;
         return fmla;
         } */
         *(fmla + i) = *(fmla + i + 1);
     }
     return fmla;
}

如果我运行这个代码,它将给出一个seg错误。如果我取消注释注释了注释的代码块,那么它将正确运行。为什么会这样?最后一个字符无论如何都是空字符(0),因此if语句不应该执行循环不会执行的任何操作。我不明白为什么它与if语句一起工作,并且在没有它的情况下给出seg错误

您访问索引
i+1
处的字符串,循环在i==strlen(fmla)时终止,这太晚了,因为在上一次迭代中,您访问字符串后的一个字符。

您访问索引
i+1
处的字符串,循环在i==strlen(fmla)时终止,这太晚了,因为在上一次迭代中,您访问了字符串后面的一个字符。

这是因为您在循环中每次都使用
重新计算strlen
=而不是
这是因为每次在循环中都要重新计算
strlen
,并使用
=
而不是像'altermann'和'dkrikun'这样的
,比如说,您正在访问一个越界元素。考虑以下事项来修正:

char* leftshift(unsigned char *fmla){
int i;
for (i = 1; i != strlen(fmla); i++) {
  /* if (i == strlen(fmla)-1){
    fmla[i] = 0;
    return fmla;
   } */
    *(fmla + i - 1) = *(fmla + i);
}
return fmla;
}
请注意,
i
已初始化为1,指针算法已更新(我已进行了最小更改以突出显示错误,但您应该只听一次有关计算
strlen(fmla)
的建议)

我假设在代码未注释时隐藏此错误的原因如下所示:

很可能你有一个任性的指针或正在越过你的目标 数组边界。printf会屏蔽它(因为程序的代码和数据 布局因该行的存在而改变),但问题是 还在那里


希望这有帮助

像'altermann'和'dkrikun'一样,您正在访问一个越界元素。考虑以下事项来修正:

char* leftshift(unsigned char *fmla){
int i;
for (i = 1; i != strlen(fmla); i++) {
  /* if (i == strlen(fmla)-1){
    fmla[i] = 0;
    return fmla;
   } */
    *(fmla + i - 1) = *(fmla + i);
}
return fmla;
}
请注意,
i
已初始化为1,指针算法已更新(我已进行了最小更改以突出显示错误,但您应该只听一次有关计算
strlen(fmla)
的建议)

我假设在代码未注释时隐藏此错误的原因如下所示:

很可能你有一个任性的指针或正在越过你的目标 数组边界。printf会屏蔽它(因为程序的代码和数据 布局因该行的存在而改变),但问题是 还在那里


希望这有帮助

使用所有警告和调试信息(例如,
gcc-Wall-g
)编译所有应用程序,并使用调试器(例如,
gdb
)查找其崩溃的方式、位置和原因。使用所有警告和调试信息(例如,
gcc-Wall-g
)编译所有应用程序,并使用调试器(例如,
gdb
)查找其原因,在哪里,为什么会崩溃。如果strln(fmla)==0,它会崩溃到。如果strln(fmla)==0,它会崩溃到。啊,好吧,我忘了字符串在C中是可变的,字符串长度可能会改变。谢谢你的解释!啊,好吧,我忘了字符串在C中是可变的,字符串长度可以改变。谢谢你的解释!
char* leftshift(unsigned char *fmla){
int i;
for (i = 1; i != strlen(fmla); i++) {
  /* if (i == strlen(fmla)-1){
    fmla[i] = 0;
    return fmla;
   } */
    *(fmla + i - 1) = *(fmla + i);
}
return fmla;
}