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;
}