在列表数组上返回指针?

时间:2014-05-04 08:29:21

标签: c arrays list pipe

我尝试写一个小shell。为此,我想为许多管道实现管道功能。为此,我尝试在较小列表中的pipeflags中分解一个单词列表,为execvp()生成一个参数数组,然后为每个管道生成一个链接。

我使用此代码生成列表数组:

struct shellvalue* list2listarray(struct shellvalue* values, unsigned int* pipecount) {
struct shellvalue* orderarray = (struct shellvalue*) malloc((pipecount[0] + 1) * sizeof(struct shellvalue));
struct shellvalue* tmp;
tmp = *(&orderarray);
struct shellvalue* currentlist;
int i = 0;
int j = 0;
while (i <= *pipecount) {
    j = 0;
    while (values && !(values->ispipe)) {
        addtoken(values->word, j, &orderarray, &currentlist);
        values = values->next;
        j++;
    }if(values){
        values = values->next;
        orderarray++;
    }
    i++;
}
tmp ++;
return tmp;}

addtocken方法以这种方式实现:

void addtoken(char* word, int counter, struct shellvalue** start,
    struct shellvalue** current) {
if (counter == 0) {
    size_t structsize = sizeof(struct shellvalue);
    struct shellvalue* tmp = (struct shellvalue*) malloc(structsize);
    tmp->word = malloc(strlen(word) + 1);
    strcpy(tmp->word, word);
    *start = tmp;
    (*start)->next = NULL;
    *current = *start;
} else {
    struct shellvalue* new = (struct shellvalue*) malloc(
            sizeof(struct shellvalue));
    new->word = malloc(strlen(word) + 1);
    strcpy(new->word, word);
    new->next = NULL;
    (*current)->next = new;
    *current = new;
}}

我的问题是经典的指针问题。我无法在list-array上使用list2listarray-Method返回一个工作指针,因此我可以轻松切换到我的列表。有人能看到问题吗?非常感谢你的时间。

1 个答案:

答案 0 :(得分:1)

在函数list2listarray中,您通过引用(或尽可能接近C)将变量orderarray 传递给addtoken函数,当您在*start = tmp函数中执行addtoken时,您实际上也会更改list2listarray函数中的指针,从而丢失您在那里分配的初始指针。

list2listarray的{​​{1}}也遇到了问题,因为这也会导致您丢失原始指针。

无需将此指针“通过引用”传递给tmp++函数,或者首先在那里进行分配。

在显示的代码中可能存在与指针使用相关的更多问题,最有可能导致undefined behavior。我建议您通过编译器打开更多警告,因为这些是查找可能存在未定义行为的地方的好方法,但不要只是添加转换作为关闭警告的方法,因为它可能无法解决实际的根本原因。并谈论铸造,don't cast the return of malloc