#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define BUF 1024 //I assume that the maximum number of arguments is 1024
main()
{
char c;
char *temp;
char *arg[BUF]; //the commands
int i=1,j,k,iter=0;
while(1)
{
i=1;
iter=0;
printf("CS21> ");
temp = malloc(sizeof(char));
while((c=fgetc(stdin))!='\n')
{
temp = realloc(temp, i*sizeof(char));
temp[i-1]=c;
i++;
}
j=0;
while(j<strlen(temp))
{
if(temp[j]==' ')
{
j++;
continue;
}
if(temp[j]!=' ') //Line 38: Same check performed as Line 42
{
k=j;
arg[iter] = malloc(sizeof(char));
while(temp[k]!=' ') //Line 42: Segmentation Fault here
{
arg[iter] = realloc(arg[iter],(k-j+1)*sizeof(char));
arg[iter][k-j]=temp[k];
k++;
}
iter++;
k++;
j=k;
continue;
}
}
}
}
您好, 以上是我的自定义shell代码中的代码示例。我还没有完成代码,以防万一你想知道程序一直持续到无穷大。 现在,我在一行(它已被评论)得到一个分段错误,但我不明白为什么。我在第38行执行与第42行相同的检查,但它没有在那里给出分段错误。任何人都可以帮助我吗?
一些上述变量的目的如下: “temp”是指向内存位置的指针,该内存位置包含给予shell的整个命令。 “args”是一个指针数组,每个指针指向一个包含命令中各个参数的内存位置。
例如,“temp”将保存字符串 - gcc hello.c -o hello,如果已经传递给我的shell。 并且args [0]将指向“gcc”,args [1]将指向“hello.c”,依此类推。
这是此代码示例的目的。在从“temp”中删除空格后,它会将所有参数存储在“args”中。当人员从shell调用exit命令时,while(1)循环将退出。但是它的一部分将分开完成。 现在任何人都可以帮我解决这个代码示例吗?
谢谢!
答案 0 :(得分:1)
当字符串中没有空格(最后一个参数的情况)时,你的循环in(temp [k]!='')没有完成。如果k&gt;你需要停止循环。 strlen的(温度)。
只是我的评论:在每个角色之后,到底是谁教你按字节读取和重新分配?这很尴尬......
答案 1 :(得分:0)
我认为以下几行:
arg[iter] = malloc(sizeof(char));
如果k
大于BUF,则会损害item
的值。如果temp
为负数,它也会损害iter
的值。这是因为k
和temp
存储在靠近arg
的堆栈上,而写arg
个超出其大小的元素实际上可能会覆盖存储在附近的变量。
尝试在上述行之前和之后打印k
和temp
,看看它们的值是否已损坏。
答案 2 :(得分:0)
在第
行while((c=fgetc(stdin))!='\n')
{
temp = realloc(temp, i*sizeof(char));
temp[i-1]=c;
i++;
}
您不会使用空终止字符结束临时字符串
然后你超出了该数组的界限
while(temp[k]!=' ') //Line 42: Segmentation Fault here
改变行
temp[i-1]=c; to temp[i-1]='\n';
和
while(temp[k]!=' ') to while(temp[k]!='\0')
答案 3 :(得分:0)
您需要为temp
分配额外的一个字符空间,用于表示字符串结尾的特殊'\0'
字符。
while((c=fgetc(stdin))!='\n')
{
temp = realloc(temp, i*sizeof(char) + 1); //1 more char space for '\0'
temp[i-1]=c;
i++;
}
temp[i] = '\0'; //Indicates the end of String
并非arg
字符串也必须以'\0'
结尾。
这样可以防止您收到的细分错误,但您可能需要检查程序可能会出现的其他情况。
有关详细信息,请参阅this。