Cod*_*sey 6 c pointers segmentation-fault undefined-behavior
长时间听众,第一次来电.
如果这个问题已经得到解决,我会道歉(我想这已经被广泛报道),但我已经搜索了很多关于指针和其他看似相关主题的问题,但我仍然无法解决我的问题.
我正在为类项目编写一个字符串库,当我尝试这个时遇到分段错误错误:
#include "str2107.h"
#include <stdio.h>
void lstrip(char *s) {
char *p, *q;
p = q = s;
while (*p == ' ' && *p != '\0') {
*p++;
}
while (*p != '\0') {
*q = *p; //this is where the actual segmentation fault occurs.
p++;
q++;
}
*q = '\0';
}
Run Code Online (Sandbox Code Playgroud)
我的主程序看起来像这样:
#include <stdio.h>
#include <stdlib.h>
#include "str2107.h"
int main(int argc, char** argv) {
char *z1 = " weeee";
printf("lstrip function\n");
printf("%s\n",z1);
lstrip(z1);
printf("%s\n",z1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
z1
指向字符串文字,修改字符串文字是未定义的行为.或者,您可以使用以下声明z1
可修改的声明:
char z1[] = " weeee";
Run Code Online (Sandbox Code Playgroud)
如果我们看看C99草案标准部分6.4.5
字符串文字第6段说(强调我的):
如果这些数组的元素具有适当的值,则这些数组是否不同是未指定的.如果程序试图修改此类数组,则行为未定义.
还有一些其他观点,如WhozCraig指出这一行:
while (*p == ' ' && *p != '\0') {
Run Code Online (Sandbox Code Playgroud)
可以更简洁地写成:
while (*p == ' ' ) {
Run Code Online (Sandbox Code Playgroud)
你也在这里使用间接:
*p++;
Run Code Online (Sandbox Code Playgroud)
但实际上并没有使用结果值,因此您可以将其更改为:
p++;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1839 次 |
最近记录: |