下面的C代码输出了一个分段错误,我很难理解为什么 #包括 无效附加(字符*s,字符n); void splitstr(字符*字符串); int main() { splitstr(“计算1-1”); printf(“\n”); splitstr(“计算1+1”); printf(“\n”); splitstr(“计算1*1”); 返回0; } 无效附加(字符*s,字符ch){ 而(*s!='\0'){ s=s+1; } *s=ch; s=s+1; *s='\0'; } void splitstr(字符*字符串){ 整数计数=1; char*表达式=”; 而(*字符串!='\0'){ 如果(计数>8){ 追加(表达式,*字符串); 字符串=字符串+1; 计数=计数+1; }否则{ 字符串=字符串+1; 计数=计数+1; } } printf(“%s”,表达式); }

下面的C代码输出了一个分段错误,我很难理解为什么 #包括 无效附加(字符*s,字符n); void splitstr(字符*字符串); int main() { splitstr(“计算1-1”); printf(“\n”); splitstr(“计算1+1”); printf(“\n”); splitstr(“计算1*1”); 返回0; } 无效附加(字符*s,字符ch){ 而(*s!='\0'){ s=s+1; } *s=ch; s=s+1; *s='\0'; } void splitstr(字符*字符串){ 整数计数=1; char*表达式=”; 而(*字符串!='\0'){ 如果(计数>8){ 追加(表达式,*字符串); 字符串=字符串+1; 计数=计数+1; }否则{ 字符串=字符串+1; 计数=计数+1; } } printf(“%s”,表达式); },c,C,输入和输出示例: 输入:计算1+1 输出:1+1 输入:计算2-6 产出:2-6 最初,这段代码不包括stdio.h(我这样做是为了在在线C编译器上测试),因为我是从头开始构建操作系统的,所以我需要自己编写所有函数。我认为问题可能出在append函数中,但我找不到它。我认为这一行是罪魁祸首: #include <stdio.h> void append(char* s, char n); void splitstr(char* string); int main() {

输入和输出示例:
输入:计算1+1
输出:1+1
输入:计算2-6
产出:2-6


最初,这段代码不包括stdio.h(我这样做是为了在在线C编译器上测试),因为我是从头开始构建操作系统的,所以我需要自己编写所有函数。我认为问题可能出在append函数中,但我找不到它。

我认为这一行是罪魁祸首:

#include <stdio.h>

void append(char* s, char n);
void splitstr(char* string);

int main()
{
    splitstr("COMPUTE 1-1");
    printf("\n");
    splitstr("COMPUTE 1+1");
    printf("\n");
    splitstr("COMPUTE 1*1");
    return 0;
}

void append(char* s, char ch) {
    while(*s != '\0'){
        s = s + 1;
    }
    *s = ch;
    s = s + 1;
    *s = '\0';
}

void splitstr(char* string){
    int count = 1;
    char* expression = "";
    while(*string != '\0'){
        if(count > 8){
            append(expression, *string);
            string = string + 1;
            count = count + 1;
        }else{
            string = string + 1;
            count = count + 1;
        }
    }
    printf("%s",expression);
}
注意
表达式
是如何声明的:

append(expression, *string);
换句话说,
表达式由一个字节组成,一个
\0
。马上,我们可以看到
append()
不会像您希望的那样工作--
while
循环将永远不会运行,因为
*s
已经是
\0

但除此之外,segfault可能发生在
append()
的底部。在while循环之后,无条件地递增
s
,然后写入它现在指向的位置。问题是,这是一个从未分配过的位置(因为
s
是对
splitstr()
表达式的引用,它是一个单字节长)。此外,由于
表达式
被声明为字符串常量,因此根据您的平台,它可能被放置在标记为只读的内存区域中。因此,这是一种试图写入内存的行为,该内存可能实际上不属于进程,也可能不可写入,从而引发故障。

而不是
char*expression=”“
char[MAX_expression_length+1]表达式


或者在append函数中使用realloc

表达式
指向字符串文字,尝试修改字符串文字会导致未定义的行为

您需要将
expression
定义为足够大的
char
数组,以存储最终结果:

char* expression = "";

因为您的结果不会比源字符串长,所以这应该足够了(前提是您的实现支持VLAs)。

在segfaulting之前它能走多远?您从不为
append
分配任何内存来写入。
char*expression=(char*)malloc(…)使用malloc works分配内存!非常感谢你们!但遗憾的是,我无法从头开始编写malloc函数,我将尝试这样做。@KurtWeber我的操作系统非常简单,以16位实模式启动,以32位保护模式加载内核(我已经完成了打印字符串、读取键盘、处理中断等工作)我现在做的是为我的操作系统开发一个简单的shell,我希望它有一个计算器的基本功能。
char expression[strlen(string)+1]; // VLA