分段错误 - 自定义Shell

时间:2013-03-03 11:00:30

标签: c shell segmentation-fault

#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)循环将退出。但是它的一部分将分开完成。 现在任何人都可以帮我解决这个代码示例吗?

谢谢!

4 个答案:

答案 0 :(得分:1)

当字符串中没有空格(最后一个参数的情况)时,你的循环in(temp [k]!='')没有完成。如果k&gt;你需要停止循环。 strlen的(温度)。

只是我的评论:在每个角色之后,到底是谁教你按字节读取和重新分配?这很尴尬......

答案 1 :(得分:0)

我认为以下几行:

arg[iter] = malloc(sizeof(char));
如果k大于BUF,则

会损害item的值。如果temp为负数,它也会损害iter的值。这是因为ktemp存储在靠近arg的堆栈上,而写arg个超出其大小的元素实际上可能会覆盖存储在附近的变量。

尝试在上述行之前和之后打印ktemp,看看它们的值是否已损坏。

答案 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