为函数中的指针赋值时的分段错误

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)

Sha*_*our 6

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)