下面的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