我尝试写一个小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, ¤tlist);
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返回一个工作指针,因此我可以轻松切换到我的列表。有人能看到问题吗?非常感谢你的时间。
答案 0 :(得分:1)
在函数list2listarray
中,您通过引用(或尽可能接近C)将变量orderarray
传递给addtoken
函数,当您在*start = tmp
函数中执行addtoken
时,您实际上也会更改list2listarray
函数中的指针,从而丢失您在那里分配的初始指针。
您list2listarray
的{{1}}也遇到了问题,因为这也会导致您丢失原始指针。
无需将此指针“通过引用”传递给tmp++
函数,或者首先在那里进行分配。
在显示的代码中可能存在与指针使用相关的更多问题,最有可能导致undefined behavior。我建议您通过编译器打开更多警告,因为这些是查找可能存在未定义行为的地方的好方法,但不要只是添加转换作为关闭警告的方法,因为它可能无法解决实际的根本原因。并谈论铸造,don't cast the return of malloc
。