0
#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

4 回答 4

1

当字符串中没有空格时(最后一个参数的情况),您在 while(temp[k]!=' ') 中的循环没有完成。如果 k > strlen(temp),则需要停止循环。

只是我的评论:到底是谁在教每个字符后按字节读取和重新分配?这很尴尬……

于 2013-03-03T11:08:53.663 回答
0

我认为以下行:

arg[iter] = malloc(sizeof(char));

kif的伤害值item大于BUF。temp如果iter为负值,它也会损坏。这是因为ktemp存储在堆栈附近arg,并且写入arg超出其大小的元素实际上可能会覆盖存储在附近的变量。

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

于 2013-03-03T11:06:23.743 回答
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')
于 2013-03-03T11:07:23.430 回答
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'

这将防止您遇到分段错误,但您可能想检查您的程序可能会失败的其他情况..

有关详细信息,请参阅

于 2013-03-03T11:20:18.523 回答